在R中,基于不同列中的字​​符串提取行

时间:2014-12-16 15:19:01

标签: r dataframe

很抱歉,如果问题的解决方案已经存在,我忽略了它。有很多类似的主题都帮助我理解了我尝试做的基本知识,但并没有完全解决我的确切问题。

我有一个数据框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和编程的初学者,所以请耐心等待。

2 个答案:

答案 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