Как реплицировать все строки кадра данных для каждого идентификатора другого кадра данных в R? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть один фрейм данных (df_features), состоящий из 32 строк и шести столбцов, которые относятся к потенциальным функциям исследования, и второй фрейм данных (df_participants), содержащий 10 000 уникальных (не числовых) идентификаторов моих участников. Нет общих столбцов на двух фреймах данных.

Я хочу создать набор данных, который содержит каждую из 32 строк из df_features для каждого идентификатора в df_participants (всего 320 000 строк и 7 столбцов).

Как мне это сделать? Я чувствую, что это должно быть просто, но я просто нигде не могу ничего найти!

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Звучит так, будто вы хотите выполнить полное внешнее объединение, которое объединит все функции со всеми идентификаторами.Это может быть сделано с использованием нескольких пакетов и в base-R со следующим:

features <- data.frame(f1=c("blue","geeen"),f2=c("young","old"))
participants <- data.frame(ID=c(1:10))

merge(features,participants,all=T)
0 голосов
/ 21 марта 2019

Я нашел довольно запутанный способ обойти это в случае, если кто-то хочет сделать что-то подобное:

matching_1<- expand.grid(df_participants$ID, df_features$feature_rownumber) %>% arrange(Var1) %>%
  rename("ID"=Var1, "feature_rownumber"=Var2)

matching_2 <- left_join(df_participants, matching_1, by="ID")

final_dataset <- left_join(matching_2, df_features, by="feature_rownumber")

Однако я вполне уверен, что должен быть более лаконичный метод!

0 голосов
/ 21 марта 2019

Вы можете сделать полное внешнее соединение. Когда вы выполняете полное внешнее объединение без общих столбцов на двух информационных фреймах, вы получаете декартово произведение двух информационных фреймов, которое вы и ищете. Вы можете получить это, используя функцию merge. Если ваши два аргумента merge - это те кадры данных, для которых вы хотите выполнить соединение, вы вернете декартово произведение этих кадров данных.

Пример:

df1 <- data.frame(y = 1:4)
df2 <- data.frame(z = 1:3)
df_merged <- merge(df1, df2)
print(df1)
#  y
#1 1
#2 2
#3 3
#4 4

print(df2)
#  z
#1 1
#2 2
#3 3

print(df_merged)
#   y z
#1  1 1
#2  2 1
#3  3 1
#4  4 1
#5  1 2
#6  2 2
#7  3 2
#8  4 2
#9  1 3
#10 2 3
#11 3 3
#12 4 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...