R 用元素向量划分数据帧

R 用元素向量划分数据帧,r,subset,R,Subset,我花了大约20分钟浏览了前面的问题,但没有找到我想要的。我有一个很大的数据框,我想根据一个名称列表对其进行子集划分,但是数据框中的名称也可以有一个未在列表中指明的后缀 换句话说,是否有一种更简单的通用方法(对于无限数量的后缀)来执行以下操作: data <- data.frame("name"=c("name1","name1_post1","name2","name2_post1", "name2_post2","name3","n

我花了大约20分钟浏览了前面的问题,但没有找到我想要的。我有一个很大的数据框,我想根据一个名称列表对其进行子集划分,但是数据框中的名称也可以有一个未在列表中指明的后缀

换句话说,是否有一种更简单的通用方法(对于无限数量的后缀)来执行以下操作:

data <- data.frame("name"=c("name1","name1_post1","name2","name2_post1",
                            "name2_post2","name3","name4"),
                   "data"=rnorm(7,0,1),
                   stringsAsFactors=FALSE)

names <- c("name2","name3")

subset <- data[ data$name %in% names | data$name %in% paste0(names,"_post1") | data$name %in% paste0(names,"_post2") , ]

数据编辑:使用正则表达式的解决方案(在OP的后续评论中):

关于您的新数据:

#                      name      data
# 3       name2_target_time 0.6295361
# 4 name2_target_time_post1 0.8951720
# 5 name2_target_time_post2 0.6602126
# 6       name3_target_time 2.2734835
此外,正如@flodel在评论下所示,这也很好用

subset(data, sub("_post\\d+$", "", name) %in% names)

旧解决方案:

data[sapply(strsplit(data$name, "_"), "[[", 1) %in% names, ]

#          name       data
# 3       name2  1.4934931
# 4 name2_post1 -1.6070809
# 5 name2_post2 -0.4157518
# 6       name3  0.4220084

其思想是:首先使用
strsplit
处拆分
字符串。这将产生一个列表。例如:
name2
将只产生
name2
(列表的第一个元素)。但是
name2\u post1
将导致
name2
post1
(列表的第二个元素)。通过使用
sapply
包装它,并使用
[
1
一起使用,我们可以只选择这个结果列表的“第一个”元素。然后我们可以使用
%in%
来检查它们是否存在于
名称中(这很简单)。

grep解决方案可能类似于以下内容:

subset <- data[grep("(name2)|(name3)",names(data)),]

非常接近的子集(upvote)。问题是我使用的实名在后缀前有多个下划线。例如“name1\u target1\u time\u 1\u后缀”。我真的在寻找某种grep函数,它可以检查一个列表与另一个列表的部分匹配。有很多方法可以做到这一点,我真的提出了这个问题,以了解更多有关r编码的信息。对我来说,似乎很奇怪,没有一个grep函数可以查找多个模式。如果你可以编辑你的帖子,那就太好了gly然后显示输入和输出?像这样?
子集(数据,sub(“\u post\\d+$”,“”,name)%in%names)
@Arun+1因为你很有耐心!20分钟?这对你来说太多了吗?一点也不。我只是说我在发布之前花了很多时间查看以前的问题。你没有花足够的时间。你在寻找一个非常具体的解决方案(使用grep),是不是太多?@agstudy如果我冒犯了你,很抱歉。我只是想学习。我没有被冒犯。我只是想告诉你,花20分钟寻找解决方案不是正确的学习方式。
data[sapply(strsplit(data$name, "_"), "[[", 1) %in% names, ]

#          name       data
# 3       name2  1.4934931
# 4 name2_post1 -1.6070809
# 5 name2_post2 -0.4157518
# 6       name3  0.4220084
subset <- data[grep("(name2)|(name3)",names(data)),]