如何基于特定的列值将相同的值添加到多个列?

时间:2019-04-15 10:39:20

标签: r

我有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

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)

基本上,您希望其余列为Col0Col1的加权平均值,其中可能的权重为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