Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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 基于data.table中的子字符串对选定列执行行操作_R_Data.table_Rowwise - Fatal编程技术网

R 基于data.table中的子字符串对选定列执行行操作

R 基于data.table中的子字符串对选定列执行行操作,r,data.table,rowwise,R,Data.table,Rowwise,我想对匹配两个不同子字符串的选定列应用一个函数。我找到了这个,但我无法从那里得到答案 这是一个重复的例子,我的尝试失败了。在本例中,我想做一个行操作,将以字符串v开头的所有列的值相加,然后从以f开头的所有列的值的平均值中减去 更新:建议的解决方案必须(a)使用:=运算符以最大限度地利用数据。表快速性能,以及(2)灵活地进行其他操作,而不是均值和求和,我在这里只是为了简单起见而使用了这两个运算符 library(data.table) # generate data dt <- dat

我想对匹配两个不同子字符串的选定列应用一个函数。我找到了这个,但我无法从那里得到答案

这是一个重复的例子,我的尝试失败了。在本例中,我想做一个行操作,将以字符串
v
开头的所有列的值相加,然后从以
f
开头的所有列的值的平均值中减去

更新:建议的解决方案必须(a)使用
:=
运算符以最大限度地利用
数据。表
快速性能,以及(2)灵活地进行其他操作,而不是
均值
求和
,我在这里只是为了简单起见而使用了这两个运算符

library(data.table)

# generate data
  dt <- data.table(id= letters[1:5],
                   v1= 1:5, 
                   v2= 1:5,
                   f1= 11:15,
                   f2= 11:15)

dt
#>    id v1 v2 f1 f2
#> 1:  a  1  1 11 11
#> 2:  b  2  2 12 12
#> 3:  c  3  3 13 13
#> 4:  d  4  4 14 14
#> 5:  e  5  5 15 15

# what I've tried
  dt[, Y := sum( .SDcols=names(dt) %like% "v" ) - mean( .SDcols=names(dt) %like% "f" ) by = id]
库(data.table)
#生成数据
dt id v1 v2 f1 f2
#>1:1111
#>2:B21212
#>3:C31313
#>4:d 4 14
#>5:e 5 15 15
#我试过的
dt[,Y:=sum(.SDcols=names(dt)%like%“v”)-mean(.SDcols=names(dt)%like%“f”)by=id]

行和
行意味着与
grep
结合可以实现这一点

dt$Y <- rowMeans(dt[,grep("f", names(dt)),with=FALSE]) - rowSums(dt[,grep("v", names(dt)),with=FALSE])

dt$Y我们
将数据集融化成“long”格式,通过使用
measure
参数,获得“v”的
平均值
“f”之间的差值,按“id”分组,将
上的“id”列与原始数据集连接,并将(
:=
)V1”指定为“Y”变量

dt[melt(dt, measure = patterns("^v", "^f"), value.name = c("v", "f"))[
         , sum(v) - mean(f), id], Y :=V1,  on = .(id)]

dt
#   id v1 v2 f1 f2  Y
#1:  a  1  1 11 11 -9
#2:  b  2  2 12 12 -8
#3:  c  3  3 13 13 -7
#4:  d  4  4 14 14 -6
#5:  e  5  5 15 15 -5

或者另一个选项是在创建索引或“v”和“f”列后使用
Reduce

nmv <- which(startsWith(names(dt), "v"))
nmf <- which(startsWith(names(dt), "f"))
l1 <- length(nmv)
dt[, Y := Reduce(`+`, .SD[, nmv, with = FALSE])- (Reduce(`+`, .SD[, nmf, with  = FALSE])/l1)]

nmv谢谢你的回答。但是,解决方案(a)必须使用
:=
运算符来最大限度地利用
数据。表
的快速性能,以及(2)它必须能够灵活地进行其他操作,而不是
平均值
总和
,我在这里使用这些运算符只是为了简单起见,OK这是有意义的。不过,我将保留这个答案,因为它可能对不需要您在原始问题中添加的附加功能的人有所帮助。当然!再次感谢!
Y
的期望输出为
-9、-8、-7、-6、-5