добавление столбца в фрейм данных на основе значений из отдельной таблицы в r

#r

#r

Вопрос:

Я хотел бы добавить столбец в этот фрейм данных, df1

    B    C
   jon   joe
   bob  stan
   ryan will
  

где значения, присвоенные каждому отдельному элементу, хранятся в df2,

 name score time 
jon  3     7  
joe  8     6 
bob  1     4 
stan 3     3
ryan 13    9
will 3     4
  

Новый столбец должен учитывать разницу между двумя отдельными оценками, полученными в результате фрейма данных df3,

 B     C      D
jon   joe   -5
bob  stan   -2
ryan will   10
  

Я смог сделать весь столбец первым отличием (джон и Джо) с
mutate(df1,(df2[df2$name==df1[1,1],2])-df2[df2$name== df1[1,2] ,2])
но не может повторить это для каждой пары людей.

Спасибо!

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

1. Для df1 , данные не являются полными. какой столбец соответствует ‘score’, ‘name’ в этом

Ответ №1:

Мы можем создать именованный вектор, а затем выполнить match цикл по столбцам и Reduce соответствующим значениям, взяв -

 nm1 <- with(df2, setNames(score, name))
df1$D <- Reduce(`-`, lapply(df1, function(x) nm1[x]))
  

-вывод

 df1
#     B    C  D
#1  jon  joe -5
#2  bob stan -2
#3 ryan will 10
  

Или другой вариант — использовать match

 Reduce(`-`, lapply(df1, function(x) df2$score[match(x, df2$name)]))
#[1] -5 -2 10
  

данные

 df1 <- structure(list(B = c("jon", "bob", "ryan"), C = c("joe", "stan", 
"will")), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(name = c("jon", "joe", "bob", "stan", "ryan", 
"will"), score = c(3L, 8L, 1L, 3L, 13L, 3L), time = c(7L, 6L, 
4L, 3L, 9L, 4L)), class = "data.frame", row.names = c(NA, -6L
))
  

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

1. Я получаю сообщение об ошибке: «только 0 могут быть смешаны с отрицательными индексами» при выполнении этого с моим кодом?

2. @orange_man не могли бы вы, пожалуйста, свериться с данными в моем сообщении. У меня все работает нормально

3. это работает, когда я использую данные в вашем сообщении, но не когда я использую свои данные

4. @orange_man я скопировал ваш пример для создания данных. Можете ли вы проверить str(df1) и str(df2) для вашего набора данных. У меня есть character класс для этих столбцов ‘B’, ‘C’ в df1 и столбца ‘name’ в df2

5. Это может быть что-то с данными, с которыми я на самом деле работаю, я использовал приведенный выше пример, чтобы представить свою проблему. Спасибо!

Ответ №2:

Вы можете попробовать :

 df3 <- df1
df3[] <- df2$score[match(unlist(df1), df2$name)]
df1$D <- df3$B - df3$C
df1

#     B    C  D
#1  jon  joe -5
#2  bob stan -2
#3 ryan will 10