【问题标题】:Retrieving rows with the same length检索具有相同长度的行
【发布时间】:2015-09-18 08:42:58
【问题描述】:

我有一个大数据框架,其结构如下所示:

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))

但它不起作用

错误:“子集”必须是逻辑的)

我无法理解它,因为它对我来说似乎是一个逻辑表达式。另外,也许有人可以提出比设置整个 data.frame 更好的解决方案。

【问题讨论】:

  • 如果 V2 到 V7 列中有 4 个值但位于不同列中会发生什么?预期的输出是什么?
  • 这是个好问题。我拥有的 df 在具有同一行的值的列之间没有空格。所以在这种情况下不用担心。

标签: r


【解决方案1】:

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" "" ""

【讨论】:

    【解决方案2】:

    这应该可行:

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

    【讨论】:

    • 我认为您不需要which()。使用df[rowSums(df!="")==5,] 应该就足够了。
    【解决方案3】:
    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 转换为字符,但假设这就是您想要做的。

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 2022-01-05
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多