2017-10-04 48 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$...的话,那么这样做是有道理的。)