#r
Вопрос:
У меня есть фрейм данных («ju»), который содержит три столбца и 230 строк. Первые два столбца представляют собой пару объектов. Третий столбец включает в себя один из этих объектов. Я хотел бы добавить четвертый столбец, который будет содержать второй объект из этой пары, как показано ниже.
Я написал код для определения значения для четвертого столбца (проигравший), но он не дает мне никаких выходных данных при его запуске.
for (i in 1:230) {
if (ju$winner[i]==ju$letter2[i]) {
paste(ju$letter1[i])
} else {
paste (ju$letter2[i])
}
}
Я не вижу, что не так с кодом. Также я был бы признателен, если бы вы могли подсказать, как я мог бы создать этот четвертый столбец непосредственно в моем фрейме данных, вместо того, чтобы создавать отдельный вектор, а затем добавлять его в фрейм данных. Спасибо
Ответ №1:
Это позволит сделать это без for
цикла:
ju$loser <- ifelse(ju$winner %in% ju$letter1, ju$letter2, ju$letter1)
Дает:
> ju
letter1 letter2 winner loser
1 a c a c
2 c b b c
3 t j j t
4 r k k r
Комментарии:
1. lab_rat_kid, мне понравилась простота вашего ответа, поэтому сначала попробовал. Но у меня есть проблема. Когда объект (для 4-го столбца) должен быть выбран из 2-го столбца, он работает хорошо. Проблема возникает, когда 4-й столбец должен быть заполнен объектом из 1-го столбца. В выводе по — прежнему используется объект из 2-го столбца. Таким образом, 4 — я колонка идентична 2-й колонке. Вот код, который я использую (на всякий случай, если я допустил ошибку при расшифровке фактических имен в моей таблице ju$loser1
2. Кстати, я воссоздал пример из своего вопроса/вашего ответа, и он хорошо работает, поэтому я не могу понять, что происходит, когда я использую его в своем фрейме данных.
3. Переменные во всех столбцах моего фактического набора данных являются «chr», если это имеет какое-либо значение.
Ответ №2:
Если вы хотите распечатать в консоли, вам нужно будет добавить:
cat(ju$letter1[i])
или
print(ju$letter1[i])
Что касается вопроса о новом столбце, возможное решение (неоптимально использовать цикл for здесь-См. Предложение от @lab_rat_kid):
ju$NewColumn = NA
for (i in 1:230) {
if (ju$winner[i]==ju$letter2[i]) {
ju$NewColumn[i] <- ju$letter1[i]
} else {
ju$NewColumn[i] <- ju$letter2[i]
}
}
Комментарии:
1. Спасибо @uceslc0. Ответ хорошо работает на воссозданных данных из вопроса. Но когда я применяю его к своим данным, он выдает ошибки: Ошибка: неожиданная ‘)’ в: «} еще { ju$NewColumn[i]<-ju$portfolio_b_label[i])» > } Ошибка: неожиданная ‘}’ в » }» <-ju$portfolio_b_label[i])» >> } Ошибка: неожиданная ‘}’ в «}» . У меня, вероятно, проблема с данными в моем наборе данных, так как у меня было то же самое с предоставленным ответом lab_rat_kid (см. Мой комментарий там). Я пока поддержу ваш ответ.
2. просто для того, чтобы было понятно, что имена букв1 и букв2 в моем наборе данных-это portfolio_a_label и portfolio_b_label.
3. Да, есть проблема с вашим фрагментом кода. Если вы удалите ) после { ju$NewColumn[i]
4. да, сработало. Я понятия не имею, как я добавил эту скобку. Я думал, что просто скопировал/вставил.
Ответ №3:
с помощью tidyverse:
dt <- tibble(l1 = c("a", "c", "t", "r"),
l2 = c("c", "b", "j", "k"),
winner = c("a", "b", "j", "k"))
dt <- dt %>%
mutate(looser = if_else(winner == l1, l2, l1))
(dt)
Комментарии:
1. Так что это решение сработало для меня. Не знаю, почему первое и второе решения не сработали бы.