#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
то, что я не знал этого раньше! Это действительно полезно.