gpt4 book ai didi

r - 在 R 中数据表的 by= 调用中循环编号变量

转载 作者:行者123 更新时间:2023-12-01 16:26:35 25 4
gpt4 key购买 nike

这很可能是愚蠢的事情,但我找不到以下问题的(非详尽的)解决方法:

让我们设置:

data<-data.table(id=c("a","a","a","b","b"),
x1=1:5,
x2=6:10,
x3=11:15)

我想要根据“id”分组的每个列变量的平均值,然后将它们作为变量附加到数据集。当然,有了这么少,我们可以使用语法:

means1<-data[,mean(x1),by=id]

类似地,对于 x2、x3,可以得到:

   id x1 x2 x3  V1 V1.1 V1.2
1: a 1 6 11 2.0 7.0 12.0
2: a 2 7 12 2.0 7.0 12.0
3: a 3 8 13 2.0 7.0 12.0
4: b 4 9 14 4.5 9.5 14.5
5: b 5 10 15 4.5 9.5 14.5

但是,对于更大的集合,我们很想循环。这是我首先尝试的:

for(nn in 1:3){
data<-data[data[,mean(paste("x",nn,sep="")),by=id]]
}

但这失败了,我猜是因为即使通常允许字符串来标识列名,平均函数也会尝试在外部运算符之前进行操作:

Warning messages:
1: In `[.data.table`(data, , mean(paste("x", nn, sep = "")), by = id) :
argument is not numeric or logical: returning NA

所以,下一次尝试:

for(nn in 1:3){
data<-data[data[,mean(data[[paste("x",nn,sep="")]]),by=id]]
}

但是,这也会失败,同样是因为均值首先起作用。 (更不用说对于习惯在 STATA 中执行类似操作的任何人来说,该语法是值得畏缩的)因此,我们最终得到为每个 id 值分配的每个 x 的总体平均值:

   id x1 x2 x3 V1 V1.1 V1.2
1: a 1 6 11 3 8 13
2: a 2 7 12 3 8 13
3: a 3 8 13 3 8 13
4: b 4 9 14 3 8 13
5: b 5 10 15 3 8 13

那么,我们如何在循环中执行这个简单的任务?

这样的语法在类似的调用中对我有用,例如:

for(nn in 1:3){
data[,paste("x_greater_than_4_",nn,sep=""):=(data[[paste("x",nn,sep="")]]>4)]
}

产生我所期望的结果:

   id x1 x2 x3 x_greater_than_4_1 x_greater_than_4_2 x_greater_than_4_3
1: a 1 6 11 FALSE TRUE TRUE
2: a 2 7 12 FALSE TRUE TRUE
3: a 3 8 13 FALSE TRUE TRUE
4: b 4 9 14 FALSE TRUE TRUE
5: b 5 10 15 TRUE TRUE TRUE

最佳答案

我首先使用 setkey 设置一个键,然后在 j 表达式中使用 lapply 并自连接结果。您可以在 lapply 中使用 .SD 以及关联的 .SDcols 按数字位置指定列。像这样:

setkey( data , id )
data[ data[ , lapply( .SD , mean ) , keyby = id , .SDcols = 2:4 ] ]
# id x1 x2 x3 x1.1 x2.1 x3.1
#1: a 1 6 11 2.0 7.0 12.0
#2: a 2 7 12 2.0 7.0 12.0
#3: a 3 8 13 2.0 7.0 12.0
#4: b 4 9 14 4.5 9.5 14.5
#5: b 5 10 15 4.5 9.5 14.5

# If you just want the group means use this:
data[ , lapply( .SD , mean ), by = id , .SDcols = 2:4 ]
<小时/>

或者,您可以将 :=by 一起使用,如下所示,这也可以避免连接:

sd_cols = c("x1", "x2", "x3")
data[, c(paste0("v", 1:3)) := lapply(.SD, mean), by=id, .SDcols=sd_cols]

# id x1 x2 x3 v1 v2 v3
# 1: a 1 6 11 2.0 7.0 12.0
# 2: a 2 7 12 2.0 7.0 12.0
# 3: a 3 8 13 2.0 7.0 12.0
# 4: b 4 9 14 4.5 9.5 14.5
# 5: b 5 10 15 4.5 9.5 14.5

关于r - 在 R 中数据表的 by= 调用中循环编号变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23561793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com