2013-05-06 3 views
2

У меня есть dataframe, который выглядит следующим образом:IfElse команда с помощью COLNAMES в R

< df1 -data.frame (с (0,0,0), С (0,1,0), C (1,0,0))

имена (DF1) < -c ("А", "в", "с")

A B C 
1 0 0 1 
2 0 1 0 
3 0 0 0 

Я хотел бы заменить "1" значения в df1 для имен столбцов, связанных с этими значениями, для создания кадра данных, который выглядит как thi с:

A B C 
1 0 0 C 
2 0 B 0 
3 0 0 0 

Я попытался следующий код, но он произвел неправильный dataframe (перечислены ниже):

data.frame (IfElse (DF == 1, COLNAMES (DF), 0))

A B C 
1 0 0 A 
2 0 B 0 
3 0 0 0 

Любая помощь будет принята с благодарностью.

+1

'DF1 <-data.frame (с (0,0,0), С (0,1,0), С (1,0,0)) имена (DF1) <- с («A», «B», «C») 'можно заменить на' df1 <-data.frame (A = c (0,0,0), B = c (0,1,0), C = c (1,0,0)) ', FYI. – prabhasp

ответ

4

Что происходит, так это то, что ifelse работает один раз за столбец, а когда дело доходит до замены элемента, он принимает n-й элемент colnames. Но так как ifelse запускается по каждому столбцу за раз, индексирование colnames заканчивается совпадением с индексом строки, а не индексом столбца. Чтобы получить правильное решение, ifelse необходимо запустить в векторах строк, а не в векторах столбцов.

Вот одно решение, в котором используется функция t (транспонирование).

t(ifelse(t(df1)==1,names(df1),0)) 
    A B C 
[1,] "0" "0" "C" 
[2,] "0" "B" "0" 
[3,] "0" "0" "0" 
+0

безупречный, спасибо. –

+1

+1 - Также рассмотрим 'ifelse (df1 == 1, colnames (df1) [col (df1)]," 0 ")' – flodel

Смежные вопросы