создать новую переменную во фрейме данных на основе нескольких критериев в r - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть набор данных, который имеет

COl1 COl2 Col3   
1     0     0 
0     1     0
0     0     1 
1     0     0 

На основании этих трех столбцов мне нужно добавить новую переменную в той же таблице

Ожидаемый результат

COl1 COl2 Col3  New_variable   
1     0     0     c1
0     1     0     c2
0     0     1     c3
1     0     0     c1

Ответы [ 3 ]

3 голосов
/ 17 февраля 2020

Если мы хотим присвоить переменную на основе присутствия 1 в каждой строке, мы можем использовать max.col.

df$New_variable <- paste0('c', max.col(df))
df
#  COl1 COl2 Col3 New_variable
#1    1    0    0           c1
#2    0    1    0           c2
#3    0    0    1           c3
#4    1    0    0           c1

В случае нескольких 1-х подряд проверьте различные ties.method в ?max.col .


Если нам нужно назначить уникальный идентификатор для каждой строки на основе, мы можем построчно вставить значения и затем использовать match для назначения идентификатора.

vals <- do.call(paste, c(df, sep = "-"))
df$New_variable <- paste0('c', match(vals, unique(vals)))
0 голосов
/ 17 февраля 2020

Другая опция base:

df$New_variable <- paste0('c', apply(df, 1, function(x) which(x != 0)))

Вывод:

  COl1 COl2 Col3 New_variable
1    1    0    0           c1
2    0    1    0           c2
3    0    0    1           c3
4    1    0    0           c1

Поскольку в тегах имеется неопределенная ссылка на dplyr, вы также можете использовать это в сочетании с purrr - хотя это явно перебор по сравнению с множеством base доступных решений (как видно из всех ответов):

library(dplyr)

df %>%
  mutate(
    New_variable = purrr::pmap(select(., 1:3), ~ paste0('c', which(c(...) != 0)))
    )

При этом в выражении select(., 1:3) вы можете выбрать столбцы для используйте (здесь мы используем все 3 столбца, так что вы можете просто использовать . вместо целого select, и это будет иметь тот же эффект).

0 голосов
/ 17 февраля 2020

Вот некоторые базовые решения R:

df$New_variable <- paste0("c",seq(df)%*%t(df))

или

df$New_variable <- paste0("c",rowSums(df*col(df)))

или

df$New_variable <- paste0("c",which(t(df)==1,arr.ind = T)[,"row"])

такие, что

> df
  COl1 COl2 Col3 New_variable
1    1    0    0           c1
2    0    1    0           c2
3    0    0    1           c3
4    1    0    0           c1

ДАННЫЕ

df <- structure(list(COl1 = c(1L, 0L, 0L, 1L), COl2 = c(0L, 1L, 0L, 
0L), Col3 = c(0L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-4L))
...