【问题标题】:Selecting rows that have certain column values in R: Result is missing rows在 R 中选择具有某些列值的行:结果缺少行
【发布时间】:2016-10-21 19:22:40
【问题描述】:

我有一个包含 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 个 x 值 A、B、C、D、E)。但是,在这样做时:

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

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

   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

我尝试将数据框的变量列从一个Factor改成一个字符,如下:

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(例如:c("ID1", "ID2", "ID5"))。因此,我需要使用上述格式的字符数组作为 ID 键导出解决方案。

任何建议将不胜感激!

【问题讨论】:

  • ...%in% c("ID1","ID2")

标签: r dataframe shiny


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2017-02-26
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多