Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在r中计算dataframe中的特定子集并将计算保存在另一个列表中_R_Subset - Fatal编程技术网

如何在r中计算dataframe中的特定子集并将计算保存在另一个列表中

如何在r中计算dataframe中的特定子集并将计算保存在另一个列表中,r,subset,R,Subset,我有两份清单: 清单1: id name age 1 jake 21 2 ashly 19 45 lana 18 51 james 23 5675 eric 25 列表2(电视观看): 这只是一个例子,真正的列表非常大:列表1-5000个id,列表2/3/4-100多万行(不是唯一的id) 我需要为每个列表2及以上计算每个id的平均值/总和/计数,并将值添加到列表1中。 请注意,我需要将计算保存在另一个具有不同行号的列表中 例如: list 1: id

我有两份清单:

清单1:

id   name  age
1    jake  21
2    ashly 19
45   lana  18
51   james 23
5675 eric  25
列表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))
}
for(1中的i:nrow(列表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

您需要更精确地使用您的语言并重复共享数据。这两个对象看起来都像是类
数据。frame
,一种特殊类型的类
列表
子集()
可以在数据帧上工作,但不能在列表上工作。如果您使用
dput()重复共享数据,这一切都将被清除
或共享代码来创建样本数据。然后编辑您的问题以使数据可复制。如果您想自己尝试解决更多问题,这似乎是一个简单的两步过程。1.为列表2中的每个id创建平均值/总和/计数-请参阅常见问题解答。2.将结果加入列表1-请参阅常见问题解答。您想要左加入吗在这种情况下,您不必共享真实数据。您只需使用
dput()重复地共享上面的数据
或共享代码以创建样本数据。请阅读我第一条评论中的链接以了解这一点。此外,正如我所说,可能您有数据帧,而不仅仅是列表。子集在数据帧上工作正常。我只是不能确定,因为您的数据没有重复共享。@allinr请在您的回答中说明您的想法r代码正在这样做,这将对未来的读者更有帮助。
#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