如何在r中计算dataframe中的特定子集并将计算保存在另一个列表中
我有两份清单: 清单1:如何在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
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