使用data.table

时间:2018-03-12 07:49:11

标签: 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)})]

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

 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”。我尝试使用evalget,但没有得到它。

同样的:

 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) ="

我是从Using paste when naming a list尝试过的:

 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

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

1 个答案:

答案 0 :(得分:6)

我们可以使用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

或来自:=

symrlang
plouf %>% 
    filter(!! rlang::sym(col) > 5) %>%
    group_by(ID) %>% 
    summarise(!! col := first(!!rlang::sym(col)))