R: Запись нескольких переменных на основе общего условия ifelse - PullRequest
0 голосов
/ 07 марта 2012

Допустим, мой набор данных содержит 3 переменные:

V1 V2 V3
1  a   b
1  c   g
2  e   c
3  d   a
4  w   e

Есть ли способ одновременно изменить значения V2 и V3 на "x" и "y", когда V1 равно 1?Другими словами, я хочу избежать:

V2 = ifelse(V1==1, 'x', V2)
V3 = ifelse(V1==1, 'y', V3)

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

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

foo <- read.table(textConnection("V1 V2 V3
1  a   b
1  c   g
2  e   c
3  d   a
4  w   e"),header=TRUE,stringsAsFactors=FALSE)

transform(foo, V2 = ifelse(V1==1, 'x', V2), V3 = ifelse(V1==1, 'y', V3))

Возвращает:

  V1 V2 V3
1  1  x  y
2  1  x  y
3  2  e  c
4  3  d  a
5  4  w  e
1 голос
/ 07 марта 2012

Я не думаю, что есть реальный способ обойти условие дважды. Небольшое улучшение может быть

V2[V1 == 1] <- 'x'
V3[V1 == 1] <- 'y'

, поскольку это позволяет избежать издержек ifelse (в частности, он оценивает как истинные, так и ложные результаты для каждого элемента в вашем тестовом векторе, а затем склеивает результаты вместе). Хотя вы могли бы сделать тест один раз с

for(i in seq_along(V1))
    if(V1[i] == 1) {
        V2[i] <- 'x'
        V3[i] <- 'y'
    }

но я предполагаю, что вы действительно не хотите этого делать.

0 голосов
/ 07 марта 2012

Не проверено, но чтобы изменить ответ Хонга, я предполагаю на

data[data$V1 ==1,] <- c(1,'x','y')

Если это не разрешено, тогда замените кишки цикла Хонга for на то же самое, то есть

 data[data$V1==1,2:3] <- c('x','y')

(Спасибо комментарию Войцеха Собала за это улучшение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...