【问题标题】:Applying vectorized subsetting across multiple columns in R在 R 中的多个列中应用矢量化子集
【发布时间】:2016-01-15 22:10:26
【问题描述】:

我试图找到一种直接的方法来矢量化/概括 data.frame 的子集。假设我有一个 data.frame:

df <- data.frame(A = 1:5, B = 10 * 1:5, C = 100 * 1:5)

每一列都有自己的条件,目标是 df 的子集,以便只有那些行保留至少一列满足条件的位置。我现在想找到一个泛化的向量化子集机制

df <- subset(df, df[,1]<2 | df[,2]< 30 | df[,3]<100)

所以我可以像这样制定它

crit <- c(2,30,100)
df <- subset(df, df$header < crit[1:3])

沿着我想去的路。

df <- subset(df, df$header < crit[1:n])

我知道一个多步骤循环解决方法,但必须有另一种方法。我很感激任何帮助。

【问题讨论】:

  • 旁注:df &lt;- data.frame(A = 1:5, B = 10 * 1:5, C = 100 * 1:5) 比使用 5 行创建数据框更容易;-)
  • df[rowSums(mapply(`&lt;`, df, crit)) &gt; 0, ] 也许?
  • 非常感谢,我已经远远落后于子集兔子洞,我忘记了 mapply!

标签: r vectorization subset logical-operators generalization


【解决方案1】:

给定:

x <- c(1:5)
y <- c(10,20,30,40,50)
z <- c(100,200,300,400,500)

# df is a base function
mydf <- data.frame(A = x, B = y, C = z)

crit <- c(2,30,100)

那么这会让你看到列中哪些值小于暴击值:

> sweep(mydf, 2, crit, "<")
         A     B     C
[1,]  TRUE  TRUE FALSE
[2,] FALSE  TRUE FALSE
[3,] FALSE FALSE FALSE
[4,] FALSE FALSE FALSE
[5,] FALSE FALSE FALSE

这将为您提供满足任何条件的行:

> subset(mydf, rowSums(sweep(mydf, 2, crit, "<")) > 0)

  A  B   C
1 1 10 100
2 2 20 200

【讨论】:

  • 也可以,rawr 的 mapply 解决方案要快一点,至少在我的机器上是这样
【解决方案2】:

这也应该有效

> df[apply(df, 1, function(x){any(x < crit)}), ]
  A  B   C
1 1 10 100
2 2 20 200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2016-05-30
    • 2019-09-16
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多