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

den*_*nis 2 r data.table

我有一个问题,我无法在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)})]
Run Code Online (Sandbox Code Playgroud)

有两件事阻碍了我的时间:

 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
Run Code Online (Sandbox Code Playgroud)

该列名为"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) ="
Run Code Online (Sandbox Code Playgroud)

在命名列表时尝试使用粘贴:

 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
Run Code Online (Sandbox Code Playgroud)

但这不是理想的结果.有人可以解释一下它的工作原理吗?

akr*_*run 6

我们可以用 setNames

plouf[get(col) > 5, setNames(list(get(col)[1]), col) ,by = ID]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我们使用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
Run Code Online (Sandbox Code Playgroud)

:=sym来自rlang

plouf %>% 
    filter(!! rlang::sym(col) > 5) %>%
    group_by(ID) %>% 
    summarise(!! col := first(!!rlang::sym(col)))
Run Code Online (Sandbox Code Playgroud)