如何在R中计算数据框的特定子集并将计算结果保存在另一个列表中。

3

I have two lists:

list 1:

id   name  age
1    jake  21
2    ashly 19
45   lana  18
51   james 23
5675 eric  25

列表2(电视观看):

id  hours 
1   1.1
1   3
1   2.5
45  5.6
45  3
51  2  
51  1
51  2

这只是一个例子,真实的列表非常庞大:列表1 - 5000个ID,列表2/3/4 - 超过100万行(不是唯一的ID)。

我需要为每个列表2及以上计算每个ID的平均值/总和/计数,并将该值添加到列表1中。请注意,我需要在另一个具有不同行号的列表中保存计算结果。

例如:

list 1:
    id   name  age  tv_average
    1    jake  21   2.2
    2    ashly 19   n/a
    45   lana  18   4.3
    51   james 23   1.6667
    5675 eric  25   n/a

这是我的尝试:

for (i in 1:nrow(list2)) {
  p <- subset(list2,list2$id==i)
  list2$tv_average[i==list2$id] <- sum(p$hours)/(nrow(p))
}

错误: 在22999行中,只有21713行起作用。


你需要在语言上更加精确,并可重复地共享数据。这两个对象看起来都像是data.frame类,这是一种特殊类型的list类。subset()可以用于数据框,但不能用于列表。如果您使用dput()或共享代码创建示例数据,所有这些都将被清除。请阅读此链接以了解如何制作良好的可重复示例,然后编辑您的问题以使您的数据可重复。 - Gregor Thomas
如果您想尝试更多自己解决,似乎这是一个简单的两步过程。1.为列表2中的每个ID创建平均值/总和/计数-请参见FAQ 如何按组求和变量?。2.将该结果加入到列表1中-请参见FAQ 如何在R中连接(合并)数据框?。在这种情况下,您需要进行左连接。 - Gregor Thomas
你不必分享真实数据。你只需要分享你手头上的数据,以便能够通过dput()或共享创建样本数据的代码来进行复现。请阅读我第一条评论中的链接以了解更多信息。另外,正如我所说,可能你有数据框,而不仅仅是列表。并且子集在数据框上可以正常工作。但我无法确定,因为你没有共享可复现的数据。 - Gregor Thomas
1个回答

2

试试这个

#Sample Data   
data1 = structure(list(id = c(1L, 2L, 45L, 51L, 5675L), name = structure(c(3L, 
1L, 5L, 4L, 2L), .Label = c("ashly", "eric", "jake", "james", 
"lana"), class = "factor"), age = c(21L, 19L, 18L, 23L, 25L) 
), .Names = c("id", 
"name", "age"), row.names = c(NA, -5L), class = "data.frame")

data2 = structure(list(id = c(1L, 1L, 1L, 3L, 45L, 45L, 51L, 51L, 51L, 
53L), hours = c(1.1, 3, 2.5, 10, 5.6, 3, 2, 1, 2, 6)), .Names = c("id", 
"hours"), class = "data.frame", row.names = c(NA, -10L))

# Use aggregate to calculate Average, Sum, and Count and Merge
merge(x = data1,
      y = aggregate(hours~id, data2, function(x)
            c(mean = mean(x),
              sum = sum(x),
              count = length(x))),
      by = "id",
      all.x = TRUE)
#    id  name age hours.mean hours.sum hours.count
#1    1  jake  21   2.200000  6.600000    3.000000
#2    2 ashly  19         NA        NA          NA
#3   45  lana  18   4.300000  8.600000    2.000000
#4   51 james  23   1.666667  5.000000    3.000000
#5 5675  eric  25         NA        NA          NA

@allinr 请在您的答案中附上代码解释,这将对未来的读者更有帮助。 - Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接