检索具有相同长度的行

时间:2015-09-18 08:42:59

标签: r

我有一个很大的data.frame,结构上看起来像这样:

a <- c("hort", 3:8)
b <- c("hort", 2:5,"NA", "NA")
d <- c("hort", 1:3, "NA", "NA", "NA")
z <- c("hort", 4:8, "NA")
y <- c("hort", 1:2, "NA", "NA", "NA", "NA")
x <- c("hort", 1:4, "NA", "NA")
df <- as.data.frame(rbind(a,b,d,z,y,x))
df <- sapply(df, as.character)
df[df=="NA"] <- ""

    V1     V2   V3  V4  V5  V6  V7
1   hort    3   4   5   6   7   8
2   hort    2   3   4   5        
3   hort    1   2   3            
4   hort    4   5   6   7   8    
5   hort    1   2                
6   hort    1   2   3   4        

我想在单独的data.frame中检索从第二列开始计数时具有四个值的行。在这种情况下,这将是第2行和第6行。因此输出看起来像这样

  V1    V2  V3  V4  V5
1 hort   2  3   4    5
2 hort   1  2   3    4

我发现很少有关于检索符合条件的行的帖子,但都没有反映我的问题。 到目前为止我想用

subset(df,length (df[1:6,]==5))

但它不起作用

  

错误:'subset'必须符合逻辑)

我无法理解它,因为它似乎是我的逻辑表达。也许有人可以建议一个比子设置整个data.frame更好的解决方案。

3 个答案:

答案 0 :(得分:2)

df实际上是一个矩阵。你可以这样做:

df[rowSums(df[,-1]!="")==4,]
#     V1     V2  V3  V4  V5  V6 V7
#[1,] "hort" "2" "3" "4" "5" "" ""
#[2,] "hort" "1" "2" "3" "4" "" ""

答案 1 :(得分:0)

df[rowSums(apply(df[,-1], 2, "!=", ""))==4,]
     V1     V2  V3  V4  V5  V6 V7
[1,] "hort" "2" "3" "4" "5" "" ""
[2,] "hort" "1" "2" "3" "4" "" ""

我不明白为什么你要将你的df转换为角色但却认为你想要做的事情。

答案 2 :(得分:0)

这应该有效:

df[which(rowSums('' != df) == 5), ]