Заполните новую переменную в фрейме данных, используя связь между двумя переменными в другом фрейме данных - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть два фрейма данных с разными # наблюдениями (один длинный с 2220 наблюдениями, другой широкий с 37 наблюдениями).Кадры данных совместно используют переменную «SID», хотя в длинном кадре данных имеется 60 строк для каждого значения SID, а в широком - только одна.Широкий фрейм данных имеет дополнительную переменную «Экспериментатор», каждый идентификатор безопасности имеет соответствующий номер Экспериментатора.Я хотел бы сделать столбец «Experimenter» в длинном фрейме данных, хотя для каждого SID есть 60 экземпляров, и я хотел бы, чтобы соответствующее значение Experimenter добавлялось и повторялось каждый раз, когда возникает значение SID (так 60 раз).

Вложенные команды if-else для каждого предмета кажутся очень утомительными, поэтому я надеюсь, что есть альтернатива

Я добавил вывод dput из каждого фрейма данных, к сожалению, я не уверенкак их встраивать.Прямо сейчас в длинном фрейме данных «SID» называется «Subject», но они являются одной и той же переменной.

Wide:

structure(list(SID = 7301:7302, Experimenter = c(2L, 1L)), .Names = c("SID", 
"Experimenter"), class = "data.frame", row.names = c(NA, -2L))

Long:

structure(list(Subject = c(7301L, 7301L, 7301L), Session = c(1L, 
1L, 1L), Stimtype = structure(c(1L, 1L, 1L), .Label = "Control", class = 
"factor"), 
Valence = structure(c(1L, 1L, 1L), .Label = "Neutral", class = "factor"), 
Block = c(1L, 1L, 1L), Image = c(12L, 17L, 22L), Group = structure(c(1L, 
3L, 2L), .Label = c("Neutral_1660", "Neutral_5300", "Neutral_7233"
), class = "factor"), Response = c(1L, 1L, 1L), Stimulus = c(1660L, 
7233L, 5300L)), .Names = c("Subject", "Session", "Stimtype", 
"Valence", "Block", "Image", "Group", "Response", "Stimulus"), class = 
"data.frame", row.names = c(NA, 
-3L))

Если мы смотрим на эти изображения, все, что я хочу сделать, это вставить переменную "Experimenter" вдлинный фрейм данных, который имеет значение «2», когда «Предмет» равен «7301» (как в широких данных), и так далее для всех субъектов.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Если я не понял неправильно, похоже, это простой случай merge / left_join

В базе R

merge(df2, df1, by.x = "Subject", by.y = "SID")
#  Subject Session Stimtype Valence Block Image        Group Response Stimulus
#1    7301       1  Control Neutral     1    12 Neutral_1660        1     1660
#2    7301       1  Control Neutral     1    17 Neutral_7233        1     7233
#3    7301       1  Control Neutral     1    22 Neutral_5300        1     5300
#  Experimenter
#1            2
#2            2
#3            2

Или с использованием dplyr

library(dplyr)
left_join(df2, df1, by = c("Subject" = "SID"))

дает тот же результат


Пример данных

df1 <- structure(list(SID = 7301:7302, Experimenter = c(2L, 1L)), .Names = c("SID",
"Experimenter"), class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(Subject = c(7301L, 7301L, 7301L), Session = c(1L,
1L, 1L), Stimtype = structure(c(1L, 1L, 1L), .Label = "Control", class =
"factor"),
Valence = structure(c(1L, 1L, 1L), .Label = "Neutral", class = "factor"),
Block = c(1L, 1L, 1L), Image = c(12L, 17L, 22L), Group = structure(c(1L,
3L, 2L), .Label = c("Neutral_1660", "Neutral_5300", "Neutral_7233"
), class = "factor"), Response = c(1L, 1L, 1L), Stimulus = c(1660L,
7233L, 5300L)), .Names = c("Subject", "Session", "Stimtype",
"Valence", "Block", "Image", "Group", "Response", "Stimulus"), class =
"data.frame", row.names = c(NA,
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...