data.table中使用字符串以列表方式命名列

2023-11-29

我有一个无法在 data.table 中正确解决的问题。我有以下数据:

plouf <- data.table(  ID = rep(LETTERS[1:10],each = 10) )
plouf[,c(paste0("X",1:10)) := lapply(1:10,function(x){sample(10,100,replace = T)})]

有两件事时不时地阻碍我:

 col <- "X1"
 plouf[get(col) > 5, .(col = get(col)[1]) ,by = ID]
    ID col
 1:  A   7
 2:  B   7
 3:  C   9
 4:  D   6
 5:  E   8
 6:  F   7
 7:  G   6
 8:  H   7
 9:  I   6
10:  J   7

该列被命名为“col”而不是“X1”。我尝试过eval, get,没听懂。

和同类:

 col <- 1
 plouf[get(paste0("X",col)) > 5, .(paste0("X",col) = get(paste0("X",col))[1]) ,by = ID]

Error: unexpected '=' in "plouf[get(paste0("X",col)) > 5, .(paste0("X",col) ="

我尝试过这个命名列表时使用粘贴 :

 plouf[get(paste0("X",col)) > 5,setNames( get(paste0("X",col))[1],paste0("X",col)) ,by = ID]

    ID V1
 1:  A  7
 2:  B  7
 3:  C  9
 4:  D  6
 5:  E  8
 6:  F  7
 7:  G  6
 8:  H  7
 9:  I  6
10:  J  7

但这不是想要的结果。有人可以解释一下它是如何工作的吗?


我们可以用setNames

plouf[get(col) > 5, setNames(list(get(col)[1]), col) ,by = ID]

或者另一个选择是setnames得到结果后

setnames(plouf[get(col) > 5, .(get(col)[1]) ,by = ID], 'V1', col)[]
#   ID X1
#1:  A  8
#2:  B  7
#3:  C  6
#4:  D 10
#5:  F  9
#6:  G  8
#7:  H 10
#8:  I  6
#9:  J  8

如果我们正在使用dplyr,那么选项是

library(dplyr)
plouf %>%
   filter_at(col, any_vars(.>5)) %>%
   group_by(ID) %>% 
   summarise_at(col, first)
# A tibble: 9 x 2
#  ID       X1
#  <chr> <int>
#1 A         8
#2 B         7
#3 C         6
#4 D        10
#5 F         9
#6 G         8
#7 H        10
#8 I         6
#9 J         8

Or with := and sym from rlang

plouf %>% 
    filter(!! rlang::sym(col) > 5) %>%
    group_by(ID) %>% 
    summarise(!! col := first(!!rlang::sym(col)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

data.table中使用字符串以列表方式命名列 的相关文章

随机推荐