我有一个很大的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更好的解决方案。
答案 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), ]