【发布时间】:2020-10-27 14:40:25
【问题描述】:
我一直坚持这个简单的任务,即根据字符向量对数据帧的行进行子集:
# the vector:
vec <- c("8cc7e656.0152.4359.8566.0581c3",
"b3696374.c6c0.49dd.833e.596e26_D2",
"f635496c.0046.4ecd.89bc.7a4f33_D2",
"e1cd3d70.132b.452f.ba10.026721_D2")
# the dataframe
df <- data.frame(PCC=c("PNNL", "VU", "PNNL", "PNNL", "PNNL", "PNNL", "PNNL", "PNNL", "VU", "PNNL"),
Participant.ID=c("01CO001", "01CO005", "01CO008", "01CO014", "01CO019",
"05CO002", "05CO003", "11CO051", "11CO052", "11CO053"),
Specimen.Label=c("5a3aa99d-ca10-45f6-939f-12392a_D2", "59891744-2db3-4541-a86a-7f911f_D2",
"8cc7e656-0152-4359-8566-0581c3", "c9730cb4-b52c-4ca8-9652-4509d0_D2",
"573048dd-2502-40e0-8e8c-c41bb8_D3", "f635496c-0046-4ecd-89bc-7a4f33_D2",
"8fab37a4-cdf9-4ce8-9081-7b9148_D2", "b3696374-c6c0-49dd-833e-596e26_D2",
"0630ecb0-b664-4e75-bb3c-fb62ee_D2", "e1cd3d70-132b-452f-ba10-026721_D2"))
我想获得一个数据框,其中仅包含由df$Specimen.Label 和vec 之间的精确匹配定义的那些行。使用简单的 df2 <- df[df$Specimen.Label %in% vec,] 返回一个 0 行的数据帧,而使用 vec2 <- which(df$Specimen.Label %in% vec) 调用行索引返回一个空类整数向量。
但是,grep 会返回正确的索引。例如grep("e1cd3d70.132b.452f.ba10.026721_D2", df$Specimen.Label) 返回10。所以我想为什么不这样复制它:
ind <- vector("numeric")
for (i in (vec)){
a <- vec[i]
ind[i] <- as.numeric(grep(a, df$Specimen.Label))
a <- NULL
}
但不幸的是,这会返回一个向量ind(长度等于vec),其中填充了NAs,而不是所需的行索引,以及一条警告,指出“要替换的项目数不是倍数替换长度”。这里有什么问题?为什么 grep 在单独调用时有效,但在循环中使用时无法返回值?提前感谢您提供富有成效的解决方案。
【问题讨论】:
-
grep假定.不是match区分_和. -
问题是
vec有点,而df$Specimen.Label有连字符,所以你的第一个命令不会返回任何内容。df[df$Specimen.Label %in% gsub("\\.", "-", vec),]返回原始数据帧的一些行(使用您的示例数据,它返回第 3、6、8、10 行)。这是你想要的输出吗?