R - 简化时的子集化?

时间:2011-07-01 18:07:35

标签: r

我还是R的新手,并通过模式完成我的所有子集:
data [生成与数据长度相同的逻辑的命令]

子集(数据,生成与数据长度相同的逻辑的命令)

例如:

test = c("A", "B","C")
ignore = c("B")
result = test[ !( test %in% ignore ) ]
result = subset( test , !( test %in% ignore ) )

但我依旧记得,从我的阅读中可以看出,还有更短/(更具可读性)的方法吗?也许使用“with”功能?

有人可以列出上述示例的替代方案,以帮助我理解子集化中的选项吗?

4 个答案:

答案 0 :(得分:6)

我不知道如何使用向量来更简洁地为您的特定示例进行子集化。关于with,您可能想到的是使用来自该数据帧的列基于条件对数据帧进行子集化。例如:

dat <- data.frame(variable1 = runif(10), variable2 = letters[1:10])

如果我们想根据使用dat的条件获取variable1的子集,我们可以这样做:

dat[dat$variable1 < 0,]

或者我们每次都可以使用dat$*来保存自己with

with(dat,dat[variable1 < 0,])

现在,您会注意到在这种情况下,我确实没有保存任何按键。但是如果你有一个长名称的数据框和一个复杂的条件,它可以节省一些。如果您正在更改相关数据框,请参阅相关的?within命令。

或者,您可以使用基本相同的subset

subset(dat, variable1 < 0)

subset也可以通过select参数处理列上的条件。

答案 1 :(得分:3)

如果测试是数据框(或列表中的对象)中的列,with函数将有所帮助,但是使用全局向量时无效。

有些人创建了一个not in运算符,可以保存你所做的几个关键笔划。如果测试中的所有值都是唯一的,那么setdiff函数可能就是你想到的(但是如果你有多个"A" s,那么setdiff只返回其中的1个)

如果忽略只有1个值,则可以使用test != ignore,但这并不能概括为忽略具有2个或更多值。

答案 2 :(得分:2)

我已经看到了替代方法的时间比较,%in%(基于匹配)是表现最佳的策略之一。

候补:

test[!test=="B"]   #logical indexing
test[which(test != "B")]  #numeric indexing
  # the which() is not superfluous when there are NA's if you want them ignored

答案 3 :(得分:1)

原始示例的另一种替代方法:

test[test != ignore]

其他方式,使用joran的例子:

set.seed(1)
df <- data.frame(variable1 = runif(10), variable2 = letters[1:10])

返回一列:df[[1]]。 df $ name是equivalent to df [[“name”,exact = FALSE]]

df[df[[1]] < 0.5, ] 
df[df["variable1"] < 0.5, ] 

返回一列的一个数据框:df[1]

df[df[1] < 0.5, ]

使用with

with(df, df[df[[1]] < 0.5, ]) # One column
with(df, df[df["variable1"] < 0.5, ]) # One column
with(df, df[df[1] < 0.5, ])  # data frame of one column

使用dplyr

library(dplyr)
filter(df, variable1 < 0.5)