【问题标题】:Column-wise subset of data frame in RR中数据框的按列子集
【发布时间】:2016-11-04 05:55:04
【问题描述】:

我需要一些有关 data.frame 的子集/过滤器的帮助。下面是我的随机数据集的代码。

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},以及不同的括号符号('[''[[')。感谢您帮助我。

【问题讨论】:

  • 原始数据框和所需输出之间到底发生了什么?输出中的行似乎不在原始数据中,因此您实际上不仅仅是 subsetting...
  • 我的代码基本上是过滤 A 列的数据。B 列和 C 列没有发生子集化。

标签: r dataframe filter subset between


【解决方案1】:

另一种选择是使用length&lt;- 在使用逻辑条件对每一列进行子集之后在末尾填充 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

【讨论】:

    【解决方案2】:

    使用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
    

    【讨论】:

    • 谢谢@Psidom,但我有一些疑问。假设我从代码中删除了以下部分 col[order(is.na(col))]。它最终返回 NA 。为什么会这样?抱歉,我只是想把它分解一下,看看它对我的学习有何帮助。
    • 如果你删除所有部分,函数什么也不返回,所以你得到所有NA。如果您想分解它,请将col[order(is.na(col))] 替换为col
    • 如果您不需要所有 NA ,我认为没有任何理由保留但您可能有自己的目的,您可以简单地使用 do.call(cbind, lapply(Fakey, function(col) {col[col &gt; 1 &amp; col &lt; 4]}))。跨度>
    • 你说得对,我不会保留 NA 的。我计划用另一个数据集中的
        LL 替换 >1 &
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2018-09-23
    • 2018-05-18
    • 2016-07-20
    • 2021-09-15
    • 2012-11-18
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多