我有4列的df
Col0 Col1 Col2 COl3 Col4
1 0 NA NA NA
2 0 NA NA NA
3 1 NA NA NA
3 0 NA NA NA
5 1 NA NA NA
我需要基于Col1的值填充Col2,Col3和Col4 因此,如果Col1为0,则Col2,Col3和Col4应该填充为0 如果Col1为1,则Col2,Col3和Col4应填充为Col0的值 其他Col2,Col3和Col4应填充Col0和Col1的平均值。
df$Col2[df$Col1==0]<-0
仅影响1列。
预期输出:
Col0 Col1 Col2 COl3 Col4
1 0 0 0 0
2 0 0 0 0
3 1 3 3 3
3 0 0 0 0
5 1 3 3 3
答案 0 :(得分:2)
Col0<-c(1,2,3,3,5)
Col1<-c(0,0,1,0,1)
Col2<-c(NA,NA,NA,NA,NA)
Col3<-c(NA,NA,NA,NA,NA)
Col4<-c(NA,NA,NA,NA,NA)
df<-data.frame(Col0,Col1,Col2,Col3,Col4)
df[which(df$Col1 == 0),3:5] <- 0
df[which(df$Col1 == 1),3:5] <- df[which(df$Col1 == 1),1]
df[which(df$Col1 != 1 & df$Col1 != 0),3:5] <-
mean(df[which(df$Col1 != 1 & df$Col1 != 0),1],df[which(df$Col1 != 1 & df$Col1 != 0),2])
#df:
Col0 Col1 Col2 Col3 Col4
1 1 0 0 0 0
2 2 0 0 0 0
3 3 1 3 3 3
4 3 0 0 0 0
5 5 1 5 5 5
答案 1 :(得分:1)
我们可以事先使用rowMeans
计算行的平均值,然后使用嵌套的ifelse
并替换列中的值。
mean_vals <- rowMeans(df[1:2])
df[3:5] <- with(df, ifelse(Col1 == 0, 0, ifelse(Col1 == 1, Col0, mean_vals)))
df
# Col0 Col1 Col2 Col3 Col4
#1 1 0 0 0 0
#2 2 0 0 0 0
#3 3 1 3 3 3
#4 3 0 0 0 0
#5 5 1 5 5 5
答案 2 :(得分:0)
基本上,您希望其余列为Col0
和Col1
的加权平均值,其中可能的权重为0、0.5和1。我们可以得到Col0
的权重与
(idx <- ((df$Col1 != 0) + (df$Col1 == 1)) / 2)
# [1] 0.0 0.0 1.0 0.0 0.5
,如果Col1
的对应元素为0,则为0;否则为0。如果Col1
的对应元素为1,则为1;否则为1。否则为0.5。因此,
df[-1:-2] <- df$Col0 * idx + df$Col1 * (1 - idx)
df
# Col0 Col1 Col2 COl3 Col4
# 1 1 0 0 0 0
# 2 2 0 0 0 0
# 3 3 1 3 3 3
# 4 3 0 0 0 0
# 5 5 1 5 5 5