很抱歉,如果问题的解决方案已经存在,我忽略了它。有很多类似的主题都帮助我理解了我尝试做的基本知识,但并没有完全解决我的确切问题。
我有一个数据框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。
这与子集完美配合,但我想在提取的行的不同组合上运行我的脚本,并且每次调整子集命令都不是非常有效。
我想过使用一个包含as作为元素的向量,分别从类型和位置得到什么。
我试过了:
v=c("A","x","z")
df.extract <- df[df$type&df$place %in% v]
但这会返回错误。
我是R和编程的初学者,所以请耐心等待。
答案 0 :(得分:3)
你可以尝试
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
您可以从感兴趣的列
创建list
个值
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)),]
答案 1 :(得分:2)
你可以创建一个函数extract
:
extract<-function(df,type,place){
df[df$type %in% type & df$place %in% place,]
}
适用于您想要执行的不同子集:
df.extract<-extract(df=df,type="A",place=c("x","y")) # or just extract(df,"A",c("x","y"))
> df.extract
type place value
1 A x 1
2 A y 2
4 A x 4
5 A y 5
df.extract<-extract(df=df,type=c("A","B"),place="y") # or just extract(df,c("A","B"),"y")
> df.extract
type place value
2 A y 2
5 A y 5
8 B y 8
11 B y 11