Как объединить два набора данных, в которых один набор данных (1D) используется в качестве переменных? - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу объединить два набора данных, в которых один набор данных (содержит 1 измерение) транспонирован и используется в качестве переменных для соединения с другим.

Например:

df = data.frame(A=1:3, B=3:5)
df2 = data.frame(lab = letters[1:5], C = seq(letters[1:5]))

df2_transposed <- data.frame(t(df2))
colnames(df2_transposed ) <- t(df2)[1,]
df2_new <- df2_transposed[2,]

# there are certainly alternatives without transposing data

Я хочу увидеть такой набор данных:

  A B a b c d e
1 1 3 1 2 3 4 5
2 2 4 1 2 3 4 5
3 3 5 1 2 3 4 5

Я пробовал два метода:

Метод 1

library(plyr)
new <- join(df, df2_new, by = NULL, type = "left", match = "all")

, который производит

  A B    a    b    c    d    e
1 1 3 <NA> <NA> <NA> <NA> <NA>
2 2 4 <NA> <NA> <NA> <NA> <NA>
3 3 5 <NA> <NA> <NA> <NA> <NA>

Метод 2

new1 =  vector('list',3)
for (i in 1:nrow(df)){
   new1[[i]] = cbind(df[i,], df2_new[1,])
}

new2 = data.frame(matrix(unlist(new1), nrow= nrow(df), byrow=T), stringsAsFactors = F)
colnames(new2) <- c(colnames(df), colnames(df2_new))

, который производит

  A B a b c d e
1 1 3 1 1 1 1 1
2 2 4 1 1 1 1 1
3 3 5 1 1 1 1 1

Все еще не повезло в решении этой проблемы.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Использование только базы R, cbind с именем list:

cbind(df, setNames(as.list(df2$C),df2$lab))
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5

Или форма замены:

df[as.character(df2$lab)] <- as.list(df2$C)
df
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5

Или форма замены без замены:

replace(df, as.character(df2$lab), as.list(df2$C))
2 голосов
/ 18 апреля 2019

Мы можем использовать cbind.fill

library(rowr)
cbind.fill(df, df2_new)
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5

Если мы хотим сделать это с помощью 'df / df2'

library(tidyverse)
deframe(df2) %>%
       as.list %>%
       as_tibble %>%  
       cbind.fill(df, .)

или аналогично подходу @thelatemails

data.frame(df, as.list(deframe(df2)))

Или с cbind из base R с дружеским предупреждением

cbind(df, df2_new)

Или повторить строки 'df2_new' и cbind

cbind(df, df2_new[rep(1, nrow(df)),])
...