【问题标题】:Merging two data.frames by two columns each将两个 data.frames 合并为两列
【发布时间】:2019-06-16 15:09:36
【问题描述】:

我有一个巨大的 data.frame 想要重新排序。想法是将其分成两半(因为前半部分包含与后半部分不同的信息)并创建第三个数据框,该数据框将是两者的组合。因为我总是需要第一个数据帧的前两列,然后是第二个数据帧的前两列,所以我需要帮助。

new1<-all_cont_video_algo[,1:826]
new2<-all_cont_video_algo[,827:length(all_cont_video_algo)]
df3<-data.frame()

新的数据框应该如下所示:

new3[new1[1],new1[2],new2[1],new2[2],new1[3],new1[4],new2[3],new2[4],new1[5],新1[6]、新2[5]、新2[6]等]。

伪算法,从数据框 new1 中 cbind 2 列,然后从数据框 new2 中 cbind 2 列,等等。

我现在尝试了以下方法(感谢 Akrun):

new1<-all_cont_video_algo[,1:826]
new2<-all_cont_video_algo[,827:length(all_cont_video_algo)]

new1<-as.data.frame(new1, stringsAsFactors =FALSE)
new2<-as.data.frame(new2, stringsAsFactors =FALSE)

df3<-data.frame()
f1 <- function(Ncol, n) {
as.integer(gl(Ncol, n, Ncol))
}  
lst1 <- split.default(new1, f1(ncol(new1), 2))
lst2 <- split.default(new2, f1(ncol(new2), 2))

lst3 <- Map(function(x, y) df3[unlist(cbind(x, y))], lst1, lst2)

但是,给我一个“未定义的列选择错误”。

【问题讨论】:

  • 当您创建数据集df1&lt;-data.frame(c(1,2,3,4,5,6,7,8)) 时,它是单列数据集,而不是多列。请检查输出
  • 该示例可能具有误导性。添加 df1 和 df2 是为了了解两个数据帧的列应如何在 df3 中表示。很抱歉,它确实使人感到困惑而不是帮助。
  • 如果是这样,你有没有试过我的解决方案。它应该可以工作,假设字符列不是factor
  • 它有效。现在我有一个长的单列向量,现在有更多的列名;)
  • 您需要多个数据集吗?在这种情况下不要使用unlist,使用Map(function(x, y) df3[c(cbind(x, y))], lst1, lst2)

标签: r


【解决方案1】:

看看下面的代码是否有帮助

library(tidyverse)

# Two sample data frames of equal number of columns and rows
df1 = mtcars %>% select(-1)
df2 = diamonds %>% slice(1:32) 

# get the column names
dn1 = names(df1)
dn2 = names(df2)

# create new ordered list
neworder = map(seq(1,length(dn1),2), # sequence with interval 2
               ~c(dn1[.x:(.x+1)], dn2[.x:(.x+1)])) %>% # a vector of two columns each
  unlist %>% # flatten the list
  na.omit # remove NAs arising from odd number of columns

# Get the data frame ordered
df3 = bind_cols(df1, df2) %>% 
  select(neworder)

【讨论】:

  • 非常感谢您的帮助。不幸的是,我收到“选择错误(.,neworder):未使用的参数(neworder)”错误:(
  • 再次检查,没有问题。 neworder 的输出是什么?以下应该是您的新订单。 ` “cyl” “disp” “carat” “cut” “hp” “drat” “color” “clarity” “wt” “qsec” “depth” “table” “vs” “am” “price” “x” “齿轮”“碳水化合物”“y”“z”`
  • neworder 的输出是列名。 chr [1:1652]。不过顺序是正确的;)
  • 看起来 select 与您已加载的其他包发生冲突。使用 dplyr::select(neworder)。 stackoverflow.com/questions/24202120/….
  • %>% dplyr::select(neworder).... Theo... 你快了 1 分钟.. 我自己发现了一个。现在我正在仔细检查我的数据。非常感谢你。我挣扎了三个多小时尝试循环等。我可以寄一些瑞士巧克力吗? ;)
【解决方案2】:

如果没有可重复的示例,则不清楚。根据描述,我们可以将数据集列split 转换为数据集的list,并使用Mapcbind 对应数据集的列,unlist 并使用它来订购第三个数据集

1) 创建一个函数,返回一个分组列用于拆分数据集

f1 <- function(Ncol, n) {
 as.integer(gl(Ncol, n, Ncol))
  } 

2) 将数据集拆分为列表

lst1 <- split.default(df1, f1(ncol(df1), 2))
lst2 <- split.default(df2, f1(ncol(df2), 2))

3) Map 通过相应的list 元素,cbindunlist 并将其用于subset 'df3' 的列

lst3 <- Map(function(x, y) df3[unlist(cbind(x, y))], lst1, lst2)

数据

df1 <- as.data.frame(matrix(letters[1:10], 2, 5), stringsAsFactors = FALSE)
df2 <- as.data.frame(matrix(1:10, 2, 5))

【讨论】:

  • 感谢您的建议。我尝试添加一个可重现的示例。
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 2017-08-08
  • 2014-01-06
  • 1970-01-01
  • 2014-04-12
  • 2014-01-03
  • 2015-07-29
  • 2014-04-01
相关资源
最近更新 更多