【发布时间】:2018-02-02 21:17:45
【问题描述】:
我的数据由一个 id 变量和多个访问变量组成,这些变量会随着时间的推移跟踪一个人的得分。我正在尝试将分数向前推进,将任何后续零更新为该分数。如果有一个 NA 我想留下它(代表没有访问),如果一个人后来得到一个新的分数,我希望新的分数继续下去。
我提供了一个可重复的小示例,但我的实际数据非常大,因此手动更新不是一种选择。我目前的尝试是使用 for 循环遍历每个人(行)的访问列。但是我收到了这个警告:
if ((!is.na(first) & first != 0) & (!is.na(second) & second == 中的错误: 参数长度为零 另外:警告信息: 在 is.na(second) 中:is.na() 应用于 'NULL' 类型的非(列表或向量)
这看起来是因为在环境中(Rstuio)首先有一个 NA_real_ 的值,第二个有一个 NULL(空)的值。
如何正确定义这些? 我在 for 循环方面没有太多经验,所以欢迎所有建议!
id <- c(101, 102, 103, 104)
visit.1 <- c(0, 21, 0, 21)
visit.2 <- c(0, 0, 50, 0)
visit.3 <- c(0, 0, 0, 44)
visit.4 <- c(NA, NA, 0, 0)
dat <- data.frame(id, visit.1, visit.2, visit.3, visit.4)
for(i in 1:nrow(dat)){
for(j in 2:ncol(dat)){
first <- dat[i, j]
second <- dat[i,(j+1)]
if((!is.na(first) & first != 0) & (!is.na(second) & second == 0)){
second <- first
} else {
second <- second
}
}
}
原始数据集:
id visit.1 visit.2 visit.3 visit.4
1 101 0 0 0 NA
2 102 21 0 0 NA
3 103 0 50 0 0
4 104 21 0 44 0
想要的最终结果:
id visit.1 visit.2 visit.3 visit.4
1 101 0 0 0 NA
2 102 21 21 21 NA
3 103 0 50 50 50
4 104 21 21 44 44
【问题讨论】:
标签: r for-loop if-statement