Преобразуйте столбцы в разделенный запятыми список, если 1 - PullRequest
3 голосов
/ 23 октября 2019

Я пытаюсь преобразовать некоторые столбцы, содержащие 1 или 0, в список через запятую с именами столбцов.

Более конкретно, с примером:

df <- data.frame(id = c(1, 2, 3, 4), A = c("0", "1", "1", "0"), B = c("1", "1", "0", "0"), C = c("0", "0", "1", "1"))

Если столбцы A, B и C равны 1, должен быть создан новый столбец «list», содержащий все разделенные запятыми «теги» (имена столбцов).

id  A   B   C
1   0   1   0
2   1   1   0
3   1   0   1
4   0   0   1

Желаемый результат:

id  A   B   C   list
1   0   1   0   B
2   1   1   0   A, B
3   1   0   1   A, C
4   0   0   1   C

Ответы [ 3 ]

6 голосов
/ 23 октября 2019

Вот опция с apply из base R

df$new <- apply(df[-1], 1, function(x) toString(names(x)[x==1]))

Здесь мы создаем столбец строки, но если мы хотим создать столбец list

df$new <- apply(df[-1], 1, function(x) names(x)[x==1])
4 голосов
/ 23 октября 2019

Поскольку вопрос помечен dplyr, вот решение, использующее это и tidyr:

library(dplyr)
library(tidyr)
df1 %>% 
  gather(col, val, A:C) %>% 
  group_by(id) %>% 
  filter(val==1) %>% 
  select(-val) %>% 
  nest(list = col) %>% 
  right_join(df1, .) %>% 
  arrange(id)
#>   id A B C list
#> 1  1 0 1 0    B
#> 2  2 1 1 0 A, B
#> 3  3 1 0 1 A, C
#> 4  4 0 0 1    C

Обновление:

Если вы хотите, чтобы столбец был классом character, то работает следующее:

df1 %>% 
  gather(col, val, A:C) %>% 
  group_by(id) %>% 
  filter(val==1) %>% 
  select(-val) %>% 
  summarise_each(list(~paste(., collapse = ", "))) %>% 
  right_join(df1, .) %>% 
  as_tibble()
#>      id A     B     C     col  
#>   <dbl> <fct> <fct> <fct> <chr>
#> 1     1 0     1     0     B    
#> 2     2 1     1     0     A, B 
#> 3     3 1     0     1     A, C 
#> 4     4 0     0     1     C
2 голосов
/ 23 октября 2019

Ниже приведено простое решение на основе петель с использованием базы R



df[1,]<-c(0,1,0)
df[2,]<-c(1,1,0)
df[3,]<-c(1,0,1)
df[4,]<-c(0,0,1)

for (i in 1:ncol(df)){
  x1<-which(df[i,]==1)
  y<-colnames(df)
  print(y[x1])
}
#output
[1] "B"
[1] "A" "B"
[1] "A" "C"
[1] "C"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...