我有一个百分比数据框,正在尝试调整它,以便每列中的所有百分比与该列中的所有其他百分比至少有 2 个百分点的差异,以便它们能够在图表上很好地显示。
df <- data.frame(c("group1", "group2", "group3", "group4"),c(29, 26, 25, 12),c(8, 7, 3, 2))
names(df) <- c("group","var1","var2")
目前我正在使用 for 循环,它可以工作,只是它是单向的:
for(c in 2:ncol(df){
for(r in 1:nrow(df)){
if(df[r,c]-order_df[r+1,c]<2){
group <- df$group[r]
df[[c]][df$group==group] <- df[[c]][df$group==group]+2
}
}
}
在这种情况下,当r=1和c=2时,if条件不成立,因为29-26>2,那么r=2和c=2,if条件成立,26会变成28 。但是,这使它太接近 29,所以我想返回 r=1 并重新检查,以便 29 可以移动到 31。如果有特定条件,有没有办法在 r 中重新启动 for 循环满足了吗?
预期输出:
expected <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(31, 28, 25, 12),var2=c(10, 7, 5, 2))
我不确定这是最好的方法,但假设你不只是希望策划事情......
for (col in 2:3) {
for (i in rev(seq_len(nrow(df)-1))) {
df[[col]][i] <- df[[col]][i] + 2*sum(abs(df[[col]][i] - df[[col]][-(1:i)]) < 2)
}
}
另一种相当流畅地使用 R 的
lapply
的方法是:
df
# group var1 var2
# 1 group1 29 8
# 2 group2 26 7
# 3 group3 25 3
# 4 group4 12 2
df[,2:3] <- lapply(df[,2:3], function(z) {
for (i in rev(seq_along(z))[-1]) {
z[i] <- z[i] + 2*sum(abs(z[i] - z[-(1:i)]) < 2)
}
z
})
df
# group var1 var2
# 1 group1 31 10
# 2 group2 28 7
# 3 group3 25 5
# 4 group4 12 2
数据
df <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(29, 26, 25, 12),var2=c(8, 7, 3, 2))
expected <- data.frame(group=c("group1", "group2", "group3", "group4"),var1=c(31, 28, 25, 12),var2=c(10, 7, 5, 2))