在R中子集向量/数据帧会产生不同的结果

时间:2019-02-12 18:29:37

标签: r subset

最近,有人问我关于在R中设置数据框的问题。我的同事有这行代码

dd2 <- subset(dd, tret == c("T1", "T2", "T3", "T4")),产生子集的1/4。与标准dd2 <- subset(dd, tret == "T1" | tret == "T2" | tret == "T3" | tret == "T4")产生960行的情况相反,第一行代码仅产生240行。

向量也发生了同样的事情。例如,

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
y <- x[x == 1 | x == 2] gives a vector different from 
y <- x[x == c(1,2)] 

对差异有何见解?谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于当我们使用vector大于1的length和另一个length> 1的值时,值的回收。

x == 1:2
#[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

其中

x
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4

并且比较按以下方式进行

rep(1:2, length.out = length(x))
#[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

在上面的示例中,将1与x的第一个元素进行比较,将2与第2个元素进行比较,再与x的第3个元素进行比较,将2与第4个元素进行比较,并重复直到向量'x'的结尾。要比较长度大于1的向量,请使用%in%

identical(x[x == 1 | x == 2], x[x %in% 1:2])
#[1] TRUE