【问题标题】:How to print a new column after merging two dataframes in R合并R中的两个数据框后如何打印新列
【发布时间】:2020-11-02 16:59:23
【问题描述】:

我有一个关于在 R 中合并数据帧后在输出数据帧中打印新列(是/否)的问题。

我有两个输入文件 1 和 2,其中包含 A 列中常见的 ID,以及其他列中的后续信息(输入文件示例如下所示)。我想要的是基于 ID 列合并两个文件并在输出数据帧中打印是/否信息(输出文件的示例如下所示)。出于合并的目的,我一直在使用 merge 函数或 library(tidyverse)in R。请帮助我。

File_1 <- read.csv(file = "./File_1.csv", stringsAsFactors = FALSE, check.names = FALSE)
File_2 <- read.csv(file = "./File_2.csv", stringsAsFactors = FALSE, check.names = FALSE)
Files_Merge <- list(File_1, File_2) %>% reduce(full_join, by = "ID")

> dput(File_2)
structure(list(ID = c(1121015L, 1125006L, 4121014L, 2721015L, 
2221014L, 2321015L, 5121013L, 10221003L, 6525003L, 1121001L, 
1021001L, 1221001L, 1321001L, 1421001L), Type = c("R", "R", "R", 
"R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R"), new = c(1121015L, 
1125006L, 4121014L, 2721015L, 2221014L, 2321015L, 5121013L, 10221003L, 
6525003L, 1121001L, 1021001L, 1221001L, 1321001L, 1421001L), 
    collect = c("D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", 
    "D9", "D10", "D11", "D12", "D13", "D14"), Type_v1 = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Type_v2 = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Freezer = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Comment = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-14L))
> dput(File_2)
structure(list(ID = c(1121015L, 1125006L, 4121014L, 2721015L, 
2221014L, 2321015L, 5121013L, 10221003L, 6525003L), Date = c("D1", 
"D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9"), num = c("5:30", 
"5:49", "5:30", "6:30", "6:30", "5:47", "9:30", "9:15", "9:10"
), B = c("A", "A", "A", "A", "A", "A", "A", "A", "A"), P = c("11", 
"5-011", "41", "27", "22", "23", "51", "102", "5-065")), class = "data.frame", row.names = c(NA, 
-9L))



 > dput(Files_Merge_output)
structure(list(ID = c(1121015L, 1125006L, 4121014L, 2721015L, 
2221014L, 2321015L, 5121013L, 10221003L, 6525003L, 1121001L, 
1021001L, 1221001L, 1321001L, 1421001L), Merged = c("Yes", "Yes", 
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "No", 
"No", "No", "No"), Type = c("R", "R", "R", "R", "R", "R", "R", 
"R", "R", "R", "R", "R", "R", "R"), new = c(1121015L, 1125006L, 
4121014L, 2721015L, 2221014L, 2321015L, 5121013L, 10221003L, 
6525003L, 1121001L, 1021001L, 1221001L, 1321001L, 1421001L), 
    collect = c("D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", 
    "D9", "D10", "D11", "D12", "D13", "D14"), Type_v1 = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Type_v2 = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Freezer = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Comment = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Date = c("D1", 
    "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", NA, NA, NA, 
    NA, NA), num = c("5:30", "5:49", "5:30", "6:30", "6:30", 
    "5:47", "9:30", "9:15", "9:10", NA, NA, NA, NA, NA), B = c("A", 
    "A", "A", "A", "A", "A", "A", "A", "A", NA, NA, NA, NA, NA
    ), P = c("11", "5-011", "41", "27", "22", "23", "51", "102", 
    "5-065", NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-14L))

谢谢,

图菲克

【问题讨论】:

  • 问个简单的问题,你有必要使用列表而不是数据框吗?
  • 我猜mutate(merged = ID %in% File_2$ID) 应该可以解决问题。
  • 嗨@oscartorom,这是一个例子,我也使用了合并功能,例如,Merged_df

标签: r dataframe merge tidyverse


【解决方案1】:

你可以试试这个。我使用了你的dput() 数据:

#Create a Flag in file2
file2$flag <- 1
#Merge
Merged <- merge(file1,file2,by='ID',all.x=T)
#Format flag
Merged$Merged <- ifelse(is.na(Merged$flag),'No','Yes')
Merged$flag <- NULL
Merged <- Merged[,c(1,13,2:12)]

由于空间原因,此处显示了一些列:

         ID Merged Type      new collect Type_v1 Type_v2 Freezer Comment Date  num
1   1021001     No    R  1021001     D11       1       1       1      NA <NA> <NA>
2   1121001     No    R  1121001     D10       1       1       1      NA <NA> <NA>
3   1121015    Yes    R  1121015      D1       1       1       1      NA   D1 5:30
4   1125006    Yes    R  1125006      D2       1       1       1      NA   D2 5:49
5   1221001     No    R  1221001     D12       1       1       1      NA <NA> <NA>
6   1321001     No    R  1321001     D13       1       1       1      NA <NA> <NA>
7   1421001     No    R  1421001     D14       1       1       1      NA <NA> <NA>
8   2221014    Yes    R  2221014      D5       1       1       1      NA   D5 6:30
9   2321015    Yes    R  2321015      D6       1       1       1      NA   D6 5:47
10  2721015    Yes    R  2721015      D4       1       1       1      NA   D4 6:30
11  4121014    Yes    R  4121014      D3       1       1       1      NA   D3 5:30
12  5121013    Yes    R  5121013      D7       1       1       1      NA   D7 9:30
13  6525003    Yes    R  6525003      D9       1       1       1      NA   D9 9:10
14 10221003    Yes    R 10221003      D8       1       1       1      NA   D8 9:15

【讨论】:

    【解决方案2】:

    您可以使用dplyr 并扩展您的代码:

    list(File_1, File_2) %>% 
      reduce(full_join, by = "ID") %>%
      mutate(Merged = ifelse(ID %in% File_2$ID, "Yes", "No"))
    

    返回

             ID Type      new collect Type_v1 Type_v2 Freezer Comment Date  num    B     P Merged
    1   1121015    R  1121015      D1       1       1       1      NA   D1 5:30    A    11    Yes
    2   1125006    R  1125006      D2       1       1       1      NA   D2 5:49    A 5-011    Yes
    3   4121014    R  4121014      D3       1       1       1      NA   D3 5:30    A    41    Yes
    4   2721015    R  2721015      D4       1       1       1      NA   D4 6:30    A    27    Yes
    5   2221014    R  2221014      D5       1       1       1      NA   D5 6:30    A    22    Yes
    6   2321015    R  2321015      D6       1       1       1      NA   D6 5:47    A    23    Yes
    7   5121013    R  5121013      D7       1       1       1      NA   D7 9:30    A    51    Yes
    8  10221003    R 10221003      D8       1       1       1      NA   D8 9:15    A   102    Yes
    9   6525003    R  6525003      D9       1       1       1      NA   D9 9:10    A 5-065    Yes
    10  1121001    R  1121001     D10       1       1       1      NA <NA> <NA> <NA>  <NA>     No
    11  1021001    R  1021001     D11       1       1       1      NA <NA> <NA> <NA>  <NA>     No
    12  1221001    R  1221001     D12       1       1       1      NA <NA> <NA> <NA>  <NA>     No
    13  1321001    R  1321001     D13       1       1       1      NA <NA> <NA> <NA>  <NA>     No
    14  1421001    R  1421001     D14       1       1       1      NA <NA> <NA> <NA>  <NA>     No
    

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2023-03-06
      • 2017-12-24
      相关资源
      最近更新 更多