Как переключаться между двумя уровнями в data.frame в R?

#r

#r

Вопрос:

У меня есть фрейм данных

 >id=c(1,2,1,1,2);type=c("B","S","S","B","B")
>temp=data.frame(id, type)
  id type
1  1    B
2  2    S
3  1    S
4  1    B
5  2    B
 

Таким образом, тип имеет два уровня: B и S. Для каждой строки, если id== 2, я хотел бы переключить уровень и пусть его id = 1, и получить что-то вроде этого:

   id type
1  1    B
2  1    B
3  1    S
4  1    B
5  1    S
 

Я пробовал кодировать:

  >for (i in 1:nrow(temp)) {
   if (temp[i,1]==2) 
     {if (temp[i,2]=="B") temp[i,2]=="S" 
      else temp[i,2]=="B";temp[i,1]=1;} }
 

Но это не сработало. Он вернул это:

   id type
1  1    B
2  1    S
3  1    S
4  1    B
5  1    B
 

temp[i,1] изменился, но temp[i,2] остался прежним. Как я могу это исправить? И есть ли какой-нибудь более простой способ сделать это, потому что мой код кажется очень неуклюжим? Заранее благодарю. -Наталья

Ответ №1:

Я думаю, это сработает. Хотя, может быть, есть более простой способ.

 id=c(1,2,1,1,2); type=c("B","S","S","B","B")
temp=data.frame(id, type, stringsAsFactors = FALSE)

temp$type2 <- ifelse(temp$type == 'B', 'S', 'B')
temp
#  id type type2
#1  1    B     S
#2  2    S     B
#3  1    S     B
#4  1    B     S
#5  2    B     S

temp2 <- temp[,1:2]   
temp2$type <- ifelse(temp$id   ==   2, temp$type2, temp$type)
temp2$id   <- 1
temp2

#  id type
#1  1    B
#2  1    B
#3  1    S
#4  1    B
#5  1    S
 

Комментарии:

1. Спасибо. И должен ли я использовать «stringsAsFactors = FALSE»? Потому что на самом деле мой фрейм данных считывается из файла csv. temp=data.frame(id, type) — это просто пример…

2.В этом случае это работает, но, похоже, не работает в моем реальном data.frame .. Вот в чем проблема: >temp$type2 [1] "S" "S" "B" "B" "B" "B" >temp$type [1] B B S S S S Levels: B S но я уже использовал это >temp=temp2=as.data.frame(test2,stringsAsFactors = FALSE) .

3. @Natalia я не уверен, что понимаю. Рассмотрите возможность редактирования вашего исходного сообщения, чтобы включить более сложный пример внизу, в котором мой код не работает. Также опубликуйте желаемый результат с этим более сложным примером, и я посмотрю, смогу ли я отредактировать свой код, чтобы вернуть правильный ответ для обоих наборов данных примеров. Если проблема в том, что я использую переменную name ( temp2 ), которую вы уже используете для чего-то другого, тогда просто измените мое имя переменной с temp2 на что-то уникальное, на то, что вы еще не используете для чего-то другого.

4. Спасибо, я думаю, это не temp2 проблема. Я добавил temp$id=as.character(temp$id) , чтобы ваш код теперь работал идеально. Большое вам спасибо за ifelse то, что я не знал этого раньше! Это действительно полезно.