#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’ в df25. Это может быть что-то с данными, с которыми я на самом деле работаю, я использовал приведенный выше пример, чтобы представить свою проблему. Спасибо!
Ответ №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