首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于data.table中子字符串的选定列的行操作

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

Stack Overflow用户
提问于 2017-06-15 14:22:37
回答 2查看 222关注 0票数 3

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

以下是我失败尝试的一个可重复的例子。为了这个例子,我想做一个逐行操作,其中我从以字符串v开头的所有列中求和值,并减去以f开头的所有列中值的平均值。

更新:建议的解决方案必须(a)使用:=操作符来充分利用data.table的快速性能,(2)灵活地处理其他操作,而不是为了简单起见而使用meansum

代码语言:javascript
运行
复制
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]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-15 15:02:11

我们将数据集分成‘melt’格式,利用measure参数,得到'v‘和'f’的summean之间的区别,按'id‘分组,将'id’列与原始数据集连接起来,并将'V1‘赋值(:=)作为'Y’变量。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)]
票数 2
EN

Stack Overflow用户

发布于 2017-06-15 14:41:57

rowSumsrowMeansgrep相结合可以实现这一目的。

代码语言:javascript
运行
复制
dt$Y <- rowMeans(dt[,grep("f", names(dt)),with=FALSE]) - rowSums(dt[,grep("v", names(dt)),with=FALSE])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44570027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档