3

我是 R 的初学者。虽然我已经阅读了很多手册和这个板,但我必须问我的第一个问题。和这里有点像,但不完全一样,我不明白那里的解释。
我有一个包含数十万行和 30 列的数据框。但是对于我的问题,我创建了一个更简单的数据框,您可以使用它:

a <- sample(c(1,3,5,9), 20, replace = TRUE)
b <- sample(c(1,NA), 20, replace = TRUE)
df <- data.frame(a,b)

现在我想比较最后一列(这里是 column b)的值,以便我迭代地查看每一行的值,如果它与下一行中的值相同。如果相同,我想0在同一行的新列中写入 a 作为值,否则它应该是 a1作为新列的值。

在这里你可以看到我的代码,这是行不通的,因为新列的行只包含0

m<-c()

for (i in seq(along=df[,1])){
    ifelse(df$b[i] == df$b[i+1],m <- 0, m <- 1)          
    df$mov <- m
}

结果,我想要得到的,看起来像下面的例子。有什么错误?还有比创建循环更好的方法吗?对于我的大数据集,循环可能会非常慢。

   a  b mov
1  9 NA   0
2  1 NA   1
3  1  1   1
4  5 NA   0
5  1 NA   0
6  3 NA   0
7  3 NA   1
8  5  1   0
9  1  1   0
10 3  1   0
11 1  1   0
12 9  1   0
13 1  1   1
14 5 NA   0
15 9 NA   0
16 9 NA   0
17 9 NA   0
18 5 NA   0
19 3 NA   0
20 1 NA   0

谢谢您的帮助!

4

3 回答 3

1

你可以做这样的事情来标记那些匹配的

df$bnext <- c(tail(df$b,-1),NA)
df$bnextsame <- ifelse(df$bnext == df$b | (is.na(df$b) & is.na(df$bnext)),0,1)

这里有很多NAs 因为NA在您的列中也有很多 sb以及与NA返回 anNA而不是 a 的任何比较TRUE/FALSE。你可以添加一个df[is.na(df$bnextsame),"bnextsame"] <- 0来解决这个问题。

于 2013-11-05T16:39:40.190 回答
1

在您的示例中需要考虑几件事。

首先,为了避免循环,您可以创建移动一个位置的向量副本。(大约有 20 种方法可以做到这一点。)然后,当您测试向量BvsC时,它将对每个位置与其相邻位置进行逐个元素的比较。

其次,相等比较不适用于 NA——它们总是返回 NA。NA == NA不是TRUENA!_ 同样,有大约 20 种方法可以解决这个问题,但在这里我只是NA将临时向量中的所有 s 替换为一个占位符,该占位符将用于相等性测试。

最后,您必须决定要对最后一个值(没有邻居)做什么。我在这里放了1,这是你对“不匹配它的邻居”的分配。

因此,根据 中可能的值范围b,您可以执行

c = df$b 
z = length(c)
c[is.na(c)] = 'x'   # replace NA with value that will allow equality test
df$mov = c(1 * !(c[1:z-1] == c[2:z]),1)     # add 1 to the end for the last value
于 2013-11-05T16:52:25.777 回答
0

zoo您可以对's使用“滚动相等性测试” rollapply。此外,identical首选==.

#identical(NA, NA)
#[1] TRUE
#NA == NA
#[1] NA

library(zoo)

df$mov <- c(rollapply(df$b, width = 2, 
        FUN = function(x) as.numeric(!identical(x[1], x[2]))), "no_comparison")
      #`!` because you want `0` as `TRUE` ;
      #I added a "no_comparison" to last value as it is not compared with any one
df
#   a  b           mov
#1  5  1             0
#2  1  1             0
#3  9  1             1
#4  5 NA             1
#5  9  1             1
#.....
#19 1 NA             0
#20 1 NA no_comparison
于 2013-11-05T18:08:27.487 回答