给出以下矢量来构建数据框:
set.seed(1)
x <- sample( LETTERS[1:4], 100, replace=TRUE)
y <- runif(100,0,100)
df <- data.frame(x,y)
如果可能的话,我希望有一个干净的代码,该代码带有循环或apply
或任何其他方法,可以针对因子data.frame
的每个级别通过不同的条件将x
子集化。例如:
level A y >30 | y <20
level B y >21 | y <12
level C y >42 | y <21
level D y >58 | y <13
答案 0 :(得分:1)
拆分应用合并方法,其中我们使用Map
对子集和条件进行并行迭代。
do.call(rbind,
Map(function(data, left, right) {
subset(x = data, subset = y > left | y < right)
},
data = split(df, df$x),
left = c(30, 21, 42, 58),
right = c(20, 12, 21, 13)
))
# x y
#A.5 A 63.349326
#A.10 A 59.876097
#A.11 A 97.617069
#A.12 A 73.179251
#A.22 A 49.559358
#A.24 A 17.344233
# ...
我们将您的数据除以x
,然后根据您的条件对每个数据进行子集化,然后将列表合并到一个数据框中。
答案 1 :(得分:0)
这样的事情
df[df$x == 'A' & (df$y > 30 | df$y < 20),]
# x y
# 2 A 71.117606
# 3 A 44.438057
# 6 A 63.244699
# 7 A 54.185802
# 11 A 39.577617
# 13 A 8.681545
# 29 A 94.437431
# ...
# or depending on what you mean by '&'
df[df$x == 'A' & df$y > 30,]
# x y
# 2 A 71.11761
# 3 A 44.43806
# 6 A 63.24470
# 7 A 54.18580
# 11 A 39.57762
# 29 A 94.43743
# 31 A 54.17604
# ...
# and then accordingly for the other cases
答案 2 :(得分:0)
我们可以使用library(data.table)
lower = c(20, 12, 21, 13)
upper = c(30, 21, 42, 58)
setDT(df)[!between(y, lower[x], upper[x]), .SD, keyby=x]
# x y
# 1: A 63.349326
# 2: A 59.876097
# 3: A 97.617069
# 4: A 73.179251
# 5: A 49.559358
# 6: A 17.344233
# 7: A 51.116978
# ...