Добавить столбец в R со значениями, основанными на переменных «имена» других столбцов - PullRequest
0 голосов
/ 23 марта 2020

Если у нас есть data.frame, скажем что-то вроде

    ///// !col1!col2!col3
      ---------------
id123   1    0    0
      ---------------
!id435   0    1    0
      ---------------
!id777   0    0    1

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

данные хотят

    ///// !col1!col2!col3!newcol
      ---------------------
id123   1    0    0   !col1
      ---------------------
!id435   0    1    0  !col2
      ---------------------
!id777   0    0    1  !col3

1) Есть ли способы сделать это в базе или plyr? 2) (необязательно), как его адаптировать, если у id123 будут оба значения 1 в col1 и col2? как «добавить» эти значения, разделенные запятой в newcol

temp$col1 <- c(1,0,0)
temp$col2 <- c(0,1,0)
temp$col3 <- c(0,0,1)

temp<-data.frame(temp$col1, temp$col2, temp$col3)

Ваша поддержка приветствуется:)

Ответы [ 2 ]

1 голос
/ 23 марта 2020

дополнительная опция

library(tidyverse)
temp2 <- data.frame(col1 = c(1, 1, 0), col2 = c(0, 1, 0), col3 = c(0, 0, 1)) 

temp2 <- temp2 %>% 
  mutate(id = row_number())

temp2 %>% 
  pivot_longer(-id) %>% 
  filter(value == 1) %>% 
  group_by(id) %>% 
  summarise(col = str_c(name, collapse = ", ")) %>% 
  left_join(temp2) %>% 
  select(-id)
1 голос
/ 23 марта 2020

Мы можем использовать max.col в base R

temp$newcol <- names(temp)[max.col(temp, 'first')]

Если у нас есть несколько единиц в одной строке и все имена столбцов как одна строка

i1 <- which(temp2 ==1, arr.ind = TRUE)
temp2$newcol <- NA_character_
temp2$newcol[unique(i1[,1])] <-  tapply(names(temp2)[i1[,2]],
         i1[,1], FUN = toString)
temp2$newcol
#[1] "col1"       "col1, col2" "col3"     

Это также обеспечит назначение только тем строкам, в которых есть 1

data

temp <- data.frame(col1  = c(1, 0, 0), col2 = c(0, 1, 0), col3 = c(0, 0, 1))
temp2 <- data.frame(col1 = c(1, 1, 0), col2 = c(0, 1, 0), col3 = c(0, 0, 1)) 
...