Как добавить одно и то же значение в несколько столбцов на основе определенного значения столбца? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть df с 4 столбцами

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

Мне нужно заполнить Col2, Col3 и Col4 на основе значений Col1 Поэтому, если 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 ]

2 голосов
/ 15 апреля 2019
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 голос
/ 15 апреля 2019

Мы можем заранее вычислить среднее значение для строк, используя 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
0 голосов
/ 15 апреля 2019

По сути, вы хотите, чтобы остальные столбцы были средневзвешенными значениями 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

так что это 0, если соответствующий элемент Col1 равен 0; это 1, если соответствующий элемент Col1 равен 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...