选择R中具有特定列值的行:结果是缺少行

时间:2016-10-21 19:22:40

标签: r dataframe shiny

我有一个包含10个变量(ID1 - 1D10)的数据框,每个变量都有5个x值(A,B,C,D,E):

library(plotly)
library(data.table)

set.seed(1)
dat <- data.frame(ID = paste0("ID",1:10), A = runif(10), B = runif(10), C = runif(10), D = runif(10), E = runif(10))
dat$ID <- as.character(dat$ID)
datt <- data.frame(t(dat))
names(datt) <- as.matrix(datt[1, ])
datt <- datt[-1, ]
datt[] <- lapply(datt, function(x) type.convert(as.character(x)))
setDT(datt, keep.rownames = TRUE)[]
colnames(datt)[1] <- "x"
dat_long <- melt(datt, id.vars ="x" )

这将按以下格式创建数据框(这是它的前7行):

   x variable     value
1: A      ID1 0.2655087
2: B      ID1 0.2059746
3: C      ID1 0.9347052
4: D      ID1 0.4820801
5: E      ID1 0.8209463
6: A      ID2 0.3721239
7: B      ID2 0.1765568

我只是试图只从这个数据框中获取具有ID1或ID2变量值的行。这应该产生10行(因为每个ID具有5个值A,B,C,D,E)。但是,在做的时候:

dat_long[dat_long$variable==c("ID1","ID2"),]

我只收到6行。具体来说,我只收到5个x值(A,C,E)中的3个:

   x variable     value
1: A      ID1 0.2655087
2: C      ID1 0.9347052
3: E      ID1 0.8209463
4: A      ID2 0.3721239
5: C      ID2 0.2121425
6: E      ID2 0.6470602

我尝试将数据框的变量列从因子更改为字符,如下所示:

dat_long$variable = as.character(dat_long$variable)
dat_long[dat_long$variable==c("ID1","ID2"),]

但这会导致完全相同的问题。当我运行which()命令时,我仍然看到同样的问题:

which(dat_long$variable==c("ID1","ID2"),)

您对如何解决此问题有任何建议吗?当我这样做时:

str(c("ID1","ID2"))

我得到以下内容:

chr [1:2] "ID1" "ID2"

我可能需要将ID的密钥保持在上面的格式中。原因是我使用的是Shiny应用程序,ID键的输入值采用这种格式。 ID键有时可以是不同的组合和数字。例如,输入可以有三个ID(例如:&#34; ID1&#34;,&#34; ID2&#34;,&#34; ID5&#34;))。因此,我需要使用上述格式的字符数组为ID键派生解决方案。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

正如@bergant建议你应该使用%in%运算符。否则,如果您想利用data.table,您可以使用以下方式快速查找:

setkey(dat_long,variable)
dat_long[J(c("ID1","ID2"))]

    x variable     value
 1: A      ID1 0.2655087
 2: B      ID1 0.2059746
 3: C      ID1 0.9347052
 4: D      ID1 0.4820801
 5: E      ID1 0.8209463
 6: A      ID2 0.3721239
 7: B      ID2 0.1765568
 8: C      ID2 0.2121425
 9: D      ID2 0.5995658
10: E      ID2 0.6470602