【问题标题】:Binding two data frames with different names of columns and rows绑定具有不同列名和行名的两个数据框
【发布时间】:2021-09-14 06:16:31
【问题描述】:

R 用户, 我有两个不同的数据框。我想在每个状态的最后一个状态名称之后插入(e.t.,rbind)第二个数据帧(df_2)。这是两个数据框的假示例:

states = rep(c("AL", "NE", "AR", "MO", "WA"),times = c(10, 10, 10, 10, 10))
schools = randomNames::randomNames(50) ## 5 first last names separated by a space
Gender = rep(c("male", "female"),times = c(18,32))
type = rep(c("private", "public"),times = c(20,30))
item1 = rnorm(50, mean=25, sd=5)
item2 = rnorm(50, mean=30, sd=5)
item3 = rnorm(50, mean=15, sd=5)
df_1 = data.frame(states, schools, Gender, type, item1, item2, item3)

FirstQuestionOptions = c("Yes", "No")
SeconsQuestionOptions = c("one", "two")
ThirdQuestionOptions = c(88, 90)
df_2 = data.frame(FirstQuestionOptions, SeconsQuestionOptions, ThirdQuestionOptions)


df_3 should be the combination of df_1 and df_2. 

然后,要使用以下命令将每个状态数据导出到单独的 excel 文件中:

list_data <- split(df_3, df_3$states)
Map(openxlsx::write.xlsx, list_data, paste0(names(list_data), '.xlsx'))

提前致谢。

【问题讨论】:

  • 示例中的df_3 是什么。使用dplyr::bind_rows(df_1, df_2)绑定不同名称的数据集
  • 应该是df_1和df_2的组合。感谢您的提问。
  • 您的意思是rbind,而不是cbind。如果是 rbind,bind_rows 会有所帮助
  • 是的,谢谢,@akrun
  • 不,它没有,只是感谢您的注意:)

标签: r data-analysis


【解决方案1】:

为此我是:

  1. 循环遍历数据集中的每个唯一状态名称
  2. 每次都创建一个新工作簿
  3. 向该工作簿添加一个作为州名的工作表
  4. 将 df_1 过滤到感兴趣的状态数据
  5. 将州数据添加到工作表中
  6. 然后将 df_2 写入每个 - 我只是随意选择了 J 列(即第 10 列),但您可以在任何地方写入。

您还可以使用 openxlsx 中的样式命令指定列是否应为特定宽度。

library(openxlsx)
library(tidyverse) #probably don't need this whole library but I usually just have this loaded
for(i in unique(states)){

    wb<- createWorkbook()
addWorksheet(wb, sheetName = i)
df_i = df_1 %>% 
    filter(states == i)
writeData(wb, sheet = i, x = df_i, startCol = 5)
writeData(wb, sheet = i, df_2, startCol = 1)
saveWorkbook(wb, paste0('YOURPATHWAY',i,".xlsx"), overwrite = TRUE)

}

【讨论】:

  • 这很棒,@Jonni。顺便说一句,我将参数“startCol”更改为“startRow”。我认为我仍然需要的唯一步骤是在 excel 文件的开头添加“df_2”,这样行就不会重叠。我的数据集包含很多行,因此几乎不可能指定“startRow = 10”或其他数字。再次感谢。
  • 如果您希望 df_2 从头开始​​,则让 startCol = 1,并为 df_i 添加 startCol = 5(或更多)。如果答案令人满意,请接受:-)
  • 非常感谢,@Jonni。这很有帮助
  • 不客气@Identicon,如果答案有效,请标记为已接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多