如何合并具有冲突值的两个数据框

时间:2019-02-02 15:17:53

标签: r

很抱歉,如果这是一个重复的问题,但是我环顾了类似的问题,却找不到真正的解决方案。无论如何,这里去了:


我已将.csv文件读入表中。在那里,我正在处理3列: “ID”(作者的ID), “num_pub”(发表的文章数量),以及 “年”(跨越1930年至2017年)。

我想获得一个最终表,其中每个“年份”和每个“ ID”都有“ num_pub”。因此,行将是“ ID”,列将是“ year”,并且如果作者未发布任何内容,则在每年的下面都有相应的“ num_pub”或0值。


我尝试创建两个新表,并以here描述的几种不同方式合并它们,但无济于事。


因此,首先我将文件读入表中: tab<-read.table("mytable.csv",sep=",",head=T,colClasses=c("character","numeric","factor"))

head(tab,10) ID num_pub year 1 00002 1 1977 2 00002 2 1978 3 00002 1 1983 4 00002 4 1984 5 00002 3 1990 6 00002 1 1994 7 00002 2 1996 8 00004 3 1957 9 00004 1 1958 10 00004 1 1959

这样,我便可以创建一个表,其中每个“ ID”都有一个单独的“ year”,如果作者在该年发布,则该值为1,否则为0: a<-table(tab[,1], tab[,3])

调用head(a,1)返回以下表:pic


我想知道如何实现上述期望的结果。即,有一个表,其中的行将填充“ ID”,列将填充“ year”(从1930年到2017年),并且在每年的下面都有一个实际的“ num_pub”值或0值。该表的结构将是就像在pic

中示出的一个

感谢您的时间和帮助。我很新的R,和那种陷进泥里与此有关。

编辑:重塑方法所解释here不解决我的问题。我需要用零代替“ NA”,我希望我的年份从1930年开始,而不是作者发表的第一年。

3 个答案:

答案 0 :(得分:3)

使用reshape2dcast可以将其更改为较宽的格式,然后通过管道将NA替换为0。

library(reshape2)
library(dplyr)

dcast(tab, ID~year, value.var = "num_pub") %>% 
  replace(is.na(.), 0)

     ID 1957 1958 1959 1977 1978 1983 1984 1990 1994 1996
1 00002    0    0    0    1    2    1    4    3    1    2
2 00004    3    1    1    0    0    0    0    0    0    0

答案 1 :(得分:2)

您可以使用complete填写不可用数据的零,然后使用spread将年份列变成多列(均来自tidyr包):< / p>

library(tidyr)

df_complete <-
  complete(df, ID, year, fill = list(num_pub = 0))

spread(df_complete, key = year, value = num_pub)

# A tibble: 2 x 11
  ID    `1957` `1958` `1959` `1977` `1978` `1983` `1984` `1990` `1994` `1996`
  <fct>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 00002      0      0      0      1      2      1      4      3      1      2
2 00004      3      1      1      0      0      0      0      0      0      0

数据:

df <-
  data.frame(ID = c("00002", "00002", "00002", "00002", "00002", "00002", "00002", "00004", "00004", "00004"),
             num_pub = c(1, 2, 1, 4, 3, 1, 2, 3, 1, 1),
             year = c(1977, 1978, 1983, 1984, 1990, 1994, 1996, 1957, 1958, 1959))

答案 2 :(得分:1)

在基础R,这可能与合并操作进行处理,随后一些胁迫至0/1通过否定deps,并使用的方法is.na。 (无可否认,as.numeric功能似乎更容易。

complete