这是我正在使用的数据集:
ID x1 x2 x3 x4 x5
1 0 0 1 .25 .25
2 0 .5 .5 1 Complete
3 0 .25 .25 .5 .75
4 0 .5 1 Complete Complete
当看到1的值连续出现时,该行中的所有剩余值应显示为“完成”。我正在尝试解决此数据中的问题,您可以看到至少有一行未遵循该规则(行1)。我想找到一种方法,可以通过for循环,整洁的变异等方式循环遍历我的数据集并读取每一行,直到找到该行中的1(如果适用)的值。如果发现该值为1,则将其所有剩余值替换为该行中的“完成”,因为无论如何这都是默认值。
这应该是数据的样子:
ID x1 x2 x3 x4 x5
1 0 0 1 Complete Complete
2 0 .5 .5 1 Complete
3 0 .25 .25 .5 .75
4 0 .5 1 Complete Complete
我现在拥有的是:
for(i in 1:nrow(data)){ position <- which(data[i, ]==1)
data[,position+1] <- "Complete" }
答案 0 :(得分:1)
检查此解决方案:
library(dplyr)
library(tidyr)
df %>%
gather(key, val, x1:x5) %>%
group_by(ID) %>%
mutate(
check = val == 1,
check = cumsum(check),
val = if_else(
val < 1 & check == 1 | val == 1 & check > 1,
'Complete',
as.character(val)
)
) %>%
select(-check) %>%
spread(key, val)
答案 1 :(得分:1)
另一种tidyverse
方法可能是:
df %>%
gather(var, val, -ID) %>%
group_by(ID) %>%
mutate(val = ifelse(row_number() > row_number(val == "1"), "Complete", val)) %>%
spread(var, val)
ID x1 x2 x3 x4 x5
<int> <chr> <chr> <chr> <chr> <chr>
1 1 0 0 1 Complete Complete
2 2 0 0.5 0.5 1 Complete
3 3 0 0.25 0.25 .5 .75
4 4 0 0.5 1 Complete Complete
第一步,它将数据从宽格式转换为长格式。其次,如果行数(每组)大于具有值1的行的行号,则将其分配为“完整”。最后,它将数据转换回原始格式。
答案 2 :(得分:0)
“老派”解决方案:
ncol <- dim(data)[2]
for (i in 1:nrow(data)){
position <- which(data[i, 2:ncol] == 1) + 1
if (length(position) != 0) {
data[i, (position + 1):ncol] <- "Complete"
}
}
data
ID x1 x2 x3 x4 x5
1 1 0 0.00 1.00 Complete Complete
2 2 0 0.50 0.50 1 Complete
3 3 0 0.25 0.25 .5 .75
4 4 0 0.50 1.00 Complete Complete