объединить имена столбцов с ненулевыми значениями столбцов в r - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть набор данных с именем, оценка 1, оценка 2, оценка 3, оценка 4, оценка 5, оценка 6 столбцов.Я хочу создать новый столбец "правило" путем объединения имен столбцов и ненулевых значений столбцов.

name    score1  score2  score3  score4  score5  score6  rule
name1   0       0       0       0       0       0        NA
name2   0       1       0       0       0       0        score2:1
name3   0       1       1       0       1       0        score2:1,score3:1,score5:1
name4   1       1       1       1       1       1        score1:1,score2:1,score3:1,score4:1,score5:1,score6:1

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

cols <- colnames(data)[-1]
data <- data[, rules := do.call(paste, c(lapply(cols, function(x) paste(x, get(x), sep=":")),              
                                          sep=","))]

Любая помощь будет высоко оценена.ТИА.

1 Ответ

1 голос
/ 19 сентября 2019

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

Вот довольно простой способ сделать это:

df <- read.table(text = "
name    score1 score2 score3 score4 score5 score6
name1   0       0       0       0       0       0
name2   0       1       0       0       0       0
name3   0       1       1       0       1       0
name4   1       1       1       1       1       1",
header = TRUE,
stringsAsFactors = FALSE
)

library(tidyr)
library(dplyr)

rule <- df %>%
  # gather data to long format with one row for each column/value pair
  gather(key = "colname",value = "value",score1:score6) %>%
  # remove zeroes for rule generation
  filter(value != 0) %>%
  # For each single value join the name and quantity
  mutate(value = paste(colname,value,sep = ": ")) %>%
  # For each name pull things together
  group_by(name) %>%
  # Collapse the results for that name into a single character vector
  summarise(value = paste(value,collapse = ", "))

# Join the rules back to the dataframe
df <- df %>%
  left_join(rule)

Результат:

> df
   name score1 score2 score3 score4 score5 score6
1 name1      0      0      0      0      0      0
2 name2      0      1      0      0      0      0
3 name3      0      1      1      0      1      0
4 name4      1      1      1      1      1      1
                                                             value
1                                                             <NA>
2                                                        score2: 1
3                                  score2: 1, score3: 1, score5: 1
4 score1: 1, score2: 1, score3: 1, score4: 1, score5: 1, score6: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...