我有一个数据框df,其中有一列文本字符串和一个单独的值列表:
c1 <- c("Jim Mackinnon","Jane Smit","Sunday 9-10","Wednesday 14-15","Friday 19-20")
c2 <- c("1123","4923","6924","4301","5023")
df <- as.data.frame(c2,c1)
df
c1 c2
Jim Mackinnon 1123
Jane Smit 4923
Sunday 9-10 6924
Wednesday 14-15 4301
Friday 19-20 5023
list_values <- c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
目标是仅选择c1中包含值的那些行,其中c1中包含list_values中的字符串之一。在该示例中,这意味着仅选择3-5行,而丢弃其余的行。有没有迭代的方法吗?
答案 0 :(得分:3)
您可以将所有list_values
粘贴到一个字符串中,然后使用grepl
查找行
subset(df,grepl(paste0(list_values, collapse = "|"), rownames(df)))
请注意,您使用的as.data.frame
使得c1
作为行名。如果您的实际意图是使用data.frame
,则可以执行以下操作:
df <- data.frame(c2,c1)
subset(df,grepl(paste0(list_values, collapse = "|"), c1))
# c2 c1
#3 6924 Sunday 9-10
#4 4301 Wednesday 14-15
#5 5023 Friday 19-20
您也可以将其与tidyverse
函数一起使用:
library(dplyr)
library(stringr)
df %>% filter(str_detect(c1, str_c(list_values, collapse = "|")))