很抱歉,如果我的问题的解决方案已经存在,而我忽略了它。有很多类似的主题都帮助我理解了我正在尝试做的事情的基础知识,但并没有完全解决我的确切问题。
我有一个数据框 df:
> type = c("A","A","A","A","A","A","B","B","B","B","B","B")
> place = c("x","y","z","x","y","z","x","y","z","x","y","z")
> value = c(1:12)
>
> df=data.frame(type,place,value)
> df
type place value
1 A x 1
2 A y 2
3 A z 3
4 A x 4
5 A y 5
6 A z 6
7 B x 7
8 B y 8
9 B z 9
10 B x 10
11 B y 11
12 B z 12
>
(我的真实数据在类型上有 3 个不同的值,在适当的位置有 10 个值,如果有区别的话)
我想根据 m 和 n 列中的字符串提取行。 例如。我想提取所有类型为 A 且位置为 x 和 z 的行,或所有类型为 A 和 B 且位置为 y 的行。
这对 subset 非常有效,但我想在提取行的不同组合上运行我的脚本,并且每次调整 subset 命令不是很有效。
我想使用一个向量,其中包含分别从类型和位置获取的元素作为元素。
我试过:
v=c("A","x","z")
df.extract <- df[df$type&df$place %in% v]
但这会返回一个错误。
我是 R 和编程的初学者,所以请多多包涵。
最佳答案
你可以试试
df[df$type=='A' & df$place %in% c('x','y'),]
# type place value
#1 A x 1
#2 A y 2
#4 A x 4
#5 A y 5
对于第二种情况
df[df$type %in% c('A', 'B') & df$place=='y',]
更新
假设您有很多列,并且需要根据来自许多列的值对数据集进行子集化。例如。
set.seed(24)
df1 <- cbind(df, df[sample(1:nrow(df)),], df[sample(1:nrow(df)),])
colnames(df1) <- paste0(c('type', 'place', 'value'), rep(1:3, each=3))
row.names(df1) <- NULL
您可以从感兴趣的列中创建值的列表
v1 <- setNames(list('A', 'x', c('A', 'B'),
'x', 'B', 'z'), paste0(c('type', 'place'), rep(1:3, each=2)))
然后使用Reduce
df1[Reduce(`&`,Map(`%in%`, df1[names(v1)], v1)),]
关于r - 在 R 中,根据不同列中的字符串提取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507874/