2017-10-04 144 views
0

比方說,我們有這樣添加水平R的數據框

x$user1, x$user2, etc.. 

x$usern組織了一個數據幀/表與屬性數據表像$age, $department, $sale, $price, etc.

我想「推」和重組在x$usern該數據幀到一個較低的水平,從而使我可以添加下面x$usern

其他數據表也許是與插圖更好:目前的結構是

x 
$user1        $user2 
$price,$age, etc.     $price, $age, etc.  

靶結構是

x 
$user1          $user2 
$data    $stat     $data    $stat 
$price,$age, etc. $min, $max, etc.   $price,$age, etc. $min, $max, etc. 

什麼是實現這一目標的最佳途徑。我正在考慮lapply和/或遍歷所有用戶,但也許有一種更優雅的方式來做到這一點?

謝謝。

+2

你可以用實際的R對象顯示一個小例子嗎?你的文字說「數據框」,但你的僞代碼似乎說「嵌套列表」,我不知道到底發生了什麼。如果你正在談論數據框架,那麼我甚至不確定'user1'是一個列本身還是''user''列'中的一行。 – Gregor

+0

user_n是x的一個屬性。 x是屬性爲user_n的數據框。數據框通過用戶分割原始數據表x $ [用戶,價格,年齡等]來檢索,然後每個用戶將被處理以進行統計,審計等。 – Kenny

回答

1

這似乎是lapply(或其親屬之一)的好地方。一些模擬數據:

x <- list(
    user1 = data.frame(price = 11, age = 12), 
    user2 = data.frame(price = 21, age = 22) 
) 
str(x) 
# List of 2 
# $ user1:'data.frame': 1 obs. of 2 variables: 
# ..$ price: num 11 
# ..$ age : num 12 
# $ user2:'data.frame': 1 obs. of 2 variables: 
# ..$ price: num 21 
# ..$ age : num 22 

轉型:

newx <- lapply(x, function(l) { 
    st <- data.frame(min = 0.9*min(l$price), max = 1.1*max(l$age)) 
    list(data = l, stat = st) 
}) 
str(newx) 
# List of 2 
# $ user1:List of 2 
# ..$ data:'data.frame': 1 obs. of 2 variables: 
# .. ..$ price: num 11 
# .. ..$ age : num 12 
# ..$ stat:'data.frame': 1 obs. of 2 variables: 
# .. ..$ min: num 9.9 
# .. ..$ max: num 13.2 
# $ user2:List of 2 
# ..$ data:'data.frame': 1 obs. of 2 variables: 
# .. ..$ price: num 21 
# .. ..$ age : num 22 
# ..$ stat:'data.frame': 1 obs. of 2 variables: 
# .. ..$ min: num 18.9 
# .. ..$ max: num 24.2 

(很顯然,我的st定義將不得不進行調整以適應您的需求。此外,它並不嚴格需要在lapply中定義。 ,但是如果你已經知道它的定義是基於x$user1$...的話,那麼這樣做是有道理的。)