2013-02-12 3 views
1

В R любая функция применяется к столбцам, что результат является логическим. Каков наилучший способ применить его по строкам? Моя цель в этом случае сделать перекодирование для А, если А, В или С составляет 1 или 6. (Если TRUE TEST $ NEW должен быть 101)Применение любых строк по строкам

Вот мой DataFrame:

A B C D 
    1 1 1 "A" 
    2 1 2 "B" 
    3 6 3 "C" 
    5 3 5 "D" 

Это может быть сделано таким образом, но должно быть умнее решение:

TEST$NEW <- ifelse(TEST$A == 1 | TEST$B == 1 | TEST$C == 1 | TEST$A == 6 | TEST$B == 6 | TEST$C == 6, 101, NA) 

ответ

4
TEST$NEW <- ifelse(apply(TEST,1,function(x) any(x==1|x==6)),101,NA) 
+0

вот что я ищу! Благодаря! – Diegoal

+0

+1 кратким и понятным! – juba

2

Один из способов сделать это, но может быть более простой:

df <- read.table(textConnection('A B C D 
1 1 1 "A" 
2 1 2 "B" 
3 6 3 "C" 
5 3 5 "D"'), header=TRUE) 

test <- rowSums(sapply(df[,c("A","B","C")], function(v) v %in% c(1,6))) 
df$TEST <- ifelse(test>0, 101, NA) 

Что дает:

A B C D TEST 
1 1 1 1 A 101 
2 2 1 2 B 101 
3 3 6 3 C 101 
4 5 3 5 D NA 
+0

Спасибо! Вы будете готовы, это сработает. – Diegoal

+0

Что я ищу - это функция, которая работает аналогично SPSS. Там у вас есть синтаксис any (A, 1, 6) | любой (B, 1, 6) .... – Diegoal

1

Другой подход:

TEST$NEW <- 101 * apply(TEST, 1, function(x) any(x %in% c(1, 6)))^NA 

    A B C D NEW 
1 1 1 1 A 101 
2 2 1 2 B 101 
3 3 6 3 C 101 
4 5 3 5 D NA 
+0

Интересно; * a priori * Я бы предположил, что «TRUE^NA» и «FALSE^NA» оба будут определены как «NA» или оба будут равны самим себе (особенно учитывая, что сила логического только, кажется, имеет смысл для неотрицательные целые числа), но при условии 'c (1,0)^NA == c (1, NA)' достаточно ясно, откуда это происходит. –

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