【问题标题】:merging two files into a new file将两个文件合并成一个新文件
【发布时间】:2014-08-24 12:15:45
【问题描述】:

我有 2 个文件,比如 3 列和几行。

1    2    10
2    3    20
3    4    30
4    5    40
5    1    50
6    1    60

1    8    10
2    3    100
3    4    45
4    5    78
5    2    99
6    80   60

现在我想创建第三个文件,其中包含前两个文件的所有值,并且如果两个文件的第一列和第二列相同,则在第三个文件中,对应于它们的值应该说,第三列中的值第一个文件必须在新创建文件的第三列中,第二个文件第三列中的值必须在新创建文件的第四列中。 根据上面的示例答案应该是

1  2  10  0
2  3  20  100
3  4  30  45
4  5  40  78
1  8  10   0
5  1  50   0
6  1  60   0
5  2  99   0
6  80 60   0

【问题讨论】:

  • 看了你的预期结果后,我认为我给你的代码不正确。关于警告消息,请检查您的列是否为factors by str(dat1)
  • 为什么预期结果中没有 1 8 10 0
  • 我使用了 str(df1)。输出是'data.frame':7 obs。 3 个变量:$ V1:因子 w/ 7 个级别“1”、“2”、“3”、“4”,..:7 1 2 3 4 5 6 $ V2:因子 w/6 个级别“1”, "2","3","4",..: 6 2 3 4 5 1 1 $ V3: 因子 w/ 7 个级别 "10","20","30",..: 7 1 2 3 4 5 6
  • 对不起,忘了说。
  • 最好将列改为numeric类。 dat1[] <- lapply(dat1, function(x) as.numeric(as.character(x)))dat2 在合并之前相同

标签: r


【解决方案1】:
 res <- merge(dat1,dat2, by=c("V1", "V2"),all=TRUE)
 indx <- is.na(res[,3]) 
 res[indx,3] <- res[indx,4]
 res[indx,4] <- NA
 res[is.na(res)] <- 0
 #    V1 V2 V3.x V3.y
 #1  1  2   10    0
 #2  1  8   10    0
 #3  2  3   20  100
 #4  3  4   30   45
 #5  4  5   40   78
 #6  5  1   50    0
 #7  5  2   99    0
 #8  6  1   60    0
 #9  6 80   60    0

数据

 dat1 <- structure(list(V1 = structure(1:6, .Label = c("1", "2", "3", 
 "4", "5", "6"), class = "factor"), V2 = structure(c(2L, 3L, 4L, 
 5L, 1L, 1L), .Label = c("1", "2", "3", "4", "5"), class = "factor"), 
V3 = structure(1:6, .Label = c("10", "20", "30", "40", "50", 
"60"), class = "factor")), .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, 
-6L))

 dat2 <- structure(list(V1 = structure(1:6, .Label = c("1", "2", "3", 
 "4", "5", "6"), class = "factor"), V2 = structure(c(5L, 2L, 3L, 
 4L, 1L, 6L), .Label = c("2", "3", "4", "5", "8", "80"), class = "factor"), 
V3 = structure(c(1L, 2L, 3L, 5L, 6L, 4L), .Label = c("10", 
"100", "45", "60", "78", "99"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -6L))

在尝试上述代码之前将数据列转换为numeric

dat1[] <- lapply(dat1, function(x) as.numeric(as.character(x))) 
dat2[] <- lapply(dat2, function(x) as.numeric(as.character(x))) 

【讨论】:

    【解决方案2】:

    如果您使用dput() 发布示例会更容易。我会检查?merge 是否有帮助或rbind.fill(包plyr)。 希望这可以帮助 赫尔曼

    【讨论】:

    • d3
    • @AmbikaGupta,您需要添加all = T,但我仍在努力理解您想要的输出。比如V1 = 1V2 = 8组合在哪里?
    • See all=TRUE and all.x and all.y ... "这些行将在那些通常用来自'y'的值填充的列中具有'NA'。默认值为'FALSE' ,所以只有来自'x'和'y'的数据的行是。”像 merge(d1,d2, by=..., all=TRUE) 这样的东西应该可以工作。如果需要,只需将 NA 替换为 0。
    • 谢谢,但是当尝试用 0 替换 NA 时会显示警告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2019-06-27
    • 2018-09-30
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多