Копирование значений из одного столбца в несколько других столбцов в зависимости от другой переменной - PullRequest
0 голосов
/ 17 октября 2018

Я хочу скопировать значения из одного столбца в новую переменную, а затем добавить эти значения в другие столбцы в зависимости от условий.

Минимальным примером будет

VP <- c("1","1","2","1","1","2","2","1", "1")
Group <- c("1","1","1","2","2","2","3","3", "3")
Value<-c("6","4","7","2","3","8","4","3", "5")

df <- data.frame(cbind(VP, Group, Value))

Целью будет результат, подобный следующему:

      VP Group Value NewVariable
      1     1     6     7
      1     1     4     7
      2     1     7
      1     2     2     8
      1     2     3     8
      2     2     8
      2     3     4
      1     3     3     4
      1     3     5     4

Итак, взяв значение VP и скопируйте его каждому другому человекув соответствующей группе, кроме собственной строки.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Предполагая, что у вас будет одно значение для VP = 2 для каждой группы, которую мы можем сделать

library(dplyr)
df %>%
  group_by(Group) %>%
  mutate(NewVar = ifelse(VP == 2, NA, Value[VP == 2]))


#  VP    Group Value NewVar
#  <chr> <chr> <chr> <chr> 
#1 1     1     6     7     
#2 1     1     4     7     
#3 2     1     7     NA    
#4 1     2     2     8     
#5 1     2     3     8     
#6 2     2     8     NA    
#7 2     3     4     NA    
#8 1     3     3     4     
#9 1     3     5     4     

Я возвращаю NA здесь вместо пустой строки.Вы можете выбрать в зависимости от ваших предпочтений.

данные

VP <- c("1","1","2","1","1","2","2","1", "1")
Group <- c("1","1","1","2","2","2","3","3", "3")
Value<-c("6","4","7","2","3","8","4","3", "5")
df <- data.frame(VP, Group, Value, stringsAsFactors = FALSE)
0 голосов
/ 17 октября 2018

Один из возможных подходов - обновление в объединении :

library(data.table)
setDT(df)[df[VP == "2"][, VP := "1"], on = .(VP, Group), NewVariable := i.Value]
df
   VP Group Value NewVariable
1:  1     1     6           7
2:  1     1     4           7
3:  2     1     7        <NA>
4:  1     2     2           8
5:  1     2     3           8
6:  2     2     8        <NA>
7:  2     3     4        <NA>
8:  1     3     3           4
9:  1     3     5           4

Или с заменой NA:

setDT(df)[df[VP == "2"][, VP := "1"], on = .(VP, Group), NewVariable := i.Value][
  is.na(NewVariable), NewVariable := ""]
df
   VP Group Value NewVariable
1:  1     1     6           7
2:  1     1     4           7
3:  2     1     7            
4:  1     2     2           8
5:  1     2     3           8
6:  2     2     8            
7:  2     3     4            
8:  1     3     3           4
9:  1     3     5           4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...