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

У меня есть следующая таблица в R

df <- data.frame('a' = c(1,0,0,1,0),
                 'b' = c(1,0,0,1,0),
                 'c' = c(1,1,0,1,1))
df
   a  b  c
1  1  1  1
2  0  0  1
3  0  0  0
4  1  1  1
4  0  0  1

То, что я хочу, это заменить значение строки именем столбца, если строка равна 1. Вывод будет такой:

   a  b  c
1  a  b  c
2  0  0  c
3  0  0  0
4  a  b  c
4  0  0  c

Как я могу сделать это в R? Спасибо.

Ответы [ 5 ]

0 голосов
/ 08 мая 2018

Вы можете сделать это с помощью ifelse, но вам нужно выполнить некоторое промежуточное транспонирование, чтобы учесть обработку ордера по мажорному столбцу.

data.frame(t(ifelse(t(df)==1,names(df),0)))
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c
0 голосов
/ 08 мая 2018

Мы можем попробовать перебрать имена фрейма данных, а затем обработать каждый столбец для базовой опции R:

df <- data.frame(a=c(1,0,0,1,0), b=c(1,0,0,1,0), c=c(1,1,0,1,1))

df <-  data.frame(sapply(names(df), function(x) {
    y <- df[[x]]
    y[y == 1] <- x
    return(y)
}))

df

  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

Демо

0 голосов
/ 08 мая 2018

Мы можем использовать

df[] <- names(df)[(NA^!df) * col(df)]
df[is.na(df)] <- 0
df
#  a b c
#1 a b c
#2 0 0 c
#3 0 0 0
#4 a b c
#4 0 0 c
0 голосов
/ 08 мая 2018

Я бы использовал Map и replace:

df[] <- Map(function(n, x) replace(x, x == 1, n), names(df), df)
df
#   a b c
# 1 a b c
# 2 0 0 c
# 3 0 0 0
# 4 a b c
# 5 0 0 c
0 голосов
/ 08 мая 2018

Можно попробовать stack и unstack

a=stack(df)
a
   values ind
1       1   a
2       0   a
3       0   a
4       1   a
5       0   a
6       1   b
7       0   b
8       0   b
9       1   b
10      0   b
11      1   c
12      1   c
13      0   c
14      1   c
15      1   c
a$values[a$values==1]=as.character(a$ind)[a$values==1]
unstack(a)
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...