我有一个包含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键派生解决方案。
非常感谢任何建议!
答案 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