добавьте столбец на основе значений в трех других столбцах

#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. Так что это решение сработало для меня. Не знаю, почему первое и второе решения не сработали бы.