在 R 中跨多个列应用矢量化子集
Applying vectorized subsetting across multiple columns in R
我试图找到一种直接的方法来 vectorize/generalize 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[apply(df, 1, function(x){any(x < crit)}), ]
A B C
1 1 10 100
2 2 20 200
鉴于:
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
我试图找到一种直接的方法来 vectorize/generalize 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[apply(df, 1, function(x){any(x < crit)}), ]
A B C
1 1 10 100
2 2 20 200
鉴于:
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