R中数据框的列子集

Column-wise subset of data frame in R

我在 data.frame 的 subset/filter 方面需要一些帮助。下面是我的随机数据集的代码。

A <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
B <- c(3,3,3,3,4,4,4,4,1,1,1,1,2,2,2,2)
C <- c(1,1,1,1,3,3,3,3,2,2,2,2,4,4,4,4)
Fakey <- data.frame(A, B, C)
Filter_Fakey <- subset(Fakey, (Fakey>1 & Fakey<4))

最后一行代码的结果如下:

> Filter_Fakey
       A  B  C
5      2  4  3
6      2  4  3
7      2  4  3
8      2  4  3
9      3  1  2
10     3  1  2
11     3  1  2
12     3  1  2
NA    NA NA NA
NA.1  NA NA NA
NA.2  NA NA NA
NA.3  NA NA NA
NA.4  NA NA NA
NA.5  NA NA NA
NA.6  NA NA NA
NA.7  NA NA NA
NA.8  NA NA NA
NA.9  NA NA NA
NA.10 NA NA NA
NA.11 NA NA NA
NA.12 NA NA NA
NA.13 NA NA NA
NA.14 NA NA NA
NA.15 NA NA NA

但我真正想要的是这个,

> Filter_Fakey
       A  B  C
5      2  3  3
6      2  3  3
7      2  3  3
8      2  3  3
9      3  2  2
10     3  2  2
11     3  2  2
12     3  2  2
NA    NA NA NA
NA.1  NA NA NA
NA.2  NA NA NA
NA.3  NA NA NA
NA.4  NA NA NA
NA.5  NA NA NA
NA.6  NA NA NA
NA.7  NA NA NA
NA.8  NA NA NA
NA.9  NA NA NA
NA.10 NA NA NA
NA.11 NA NA NA
NA.12 NA NA NA
NA.13 NA NA NA
NA.14 NA NA NA
NA.15 NA NA NA

我试过 subset(), subset(with a negation condition), filter{dplyr},以及不同的括号符号 ('[''[[')。谢谢你帮我。

使用 lapply 循环遍历数据框的列,并将条件外的值设置为 NA(如果这是您想要的)。使用 order(is.na(...))NA 个值排列到最后位置:

do.call(cbind, lapply(Fakey, function(col) {
                             col[col <= 1 | col >= 4] <- NA; col[order(is.na(col))]
                         }))

    A  B  C
1   2  3  3
2   2  3  3
3   2  3  3
4   2  3  3
5   3  2  2
6   3  2  2
7   3  2  2
8   3  2  2
9  NA NA NA
10 NA NA NA
11 NA NA NA
12 NA NA NA
13 NA NA NA
14 NA NA NA
15 NA NA NA
16 NA NA NA

另一种选择是使用 length<- 在使用逻辑条件对每个列进行子集化后在末尾填充 NA。

data.frame(lapply(Fakey, function(x) `length<-`(x[x > 1 & x <4], nrow(Fakey))))
#    A  B  C
#1   2  3  3
#2   2  3  3
#3   2  3  3
#4   2  3  3
#5   3  2  2
#6   3  2  2
#7   3  2  2
#8   3  2  2
#9  NA NA NA
#10 NA NA NA
#11 NA NA NA
#12 NA NA NA
#13 NA NA NA
#14 NA NA NA
#15 NA NA NA
#16 NA NA NA