2016-09-13 50 views
1

我有一个三列和数千行的数据框。前两列(x和y)包含字符串,第三列(z)包含数字数据。我需要根据前两列中的匹配值对数据框进行子集分析。基于字符串匹配的子集R数据框在两列

x <- c("a", "b", "c", "d", "f", "g", "h", "i", "j", "k") 
    y <- c("h", "b", "k", "a", "g", "d", "i", "c", "f", "j") 
    z <- c(1:10) 
    df <- data.frame(x, y, z) 

     x y z 
    1 a h 1 
    2 b b 2 
    3 c k 3 
    4 d a 4 
    5 f g 5 
    6 g d 6 
    7 h i 7 
    8 i c 8 
    9 j f 9 
    10 k j 10 

说这是我的表,我感兴趣的值是 “A”, “C”, “F”, “h” 和 “K”。我只想要回其中x和y包含五个一排,所以在这种情况下,行1和3

我已经试过:

df2 <- filter(df, 
      x == ("a" | "c" | "f" | "h" | "k") & 
      y == ("a" | "c" | "f" | "h" | "k")) 

但这不起作用因素或字符串。有没有相同或其他方法呢?

在此先感谢。

回答

1

我认为这将返回你在找什么:

# build vector of necessary elements 
mustHaves <- c("a", "c", "f", "h", "k") 
# perform subsetting 
df[with(df, x %in% mustHaves & y %in% mustHaves),] 
    x y z 
1 a h 1 
3 c k 3 

数据

df <- data.frame(x, y, z, stringsAsFactors = FALSE) 
+0

一个完美的答案,这么快!非常感谢。 –

0

随着dplyr

df2 <- filter(df, 
       x %in% c("a" ,"c","f" ,"h","k") & 
        y %in% c("a" ,"c","f" ,"h","k")) 
df2 
    x y z 
1 a h 1 
2 c k 3 
+1

谢谢,这也很完美。所以我的错误是使用==代替%中的%。我对R很新,所以我之前没有遇到%。 –

+0

没问题,yep,'%in%''基本上匹配下面的vector中的任何字符串。考虑接受上述解决方案之一,以便关闭问题。 –

0

什么:

df2 <- filter(df, grepl("[acfhk]",x) & grepl("[acfhk]",y)) 

使用dplyr

+0

谢谢,这也很完美。三种不同的方式来实现相同的事情。我有很多要学习的。 –

+0

不客气。如果您希望处理真正大的数据集,那么可能值得检查哪一个最快。 – kwicher

相关问题