很抱歉,如果这是一个重复的问题,但是我环顾了类似的问题,却找不到真正的解决方案。无论如何,这里去了:
我已将.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年开始,而不是作者发表的第一年。
答案 0 :(得分:3)
使用reshape2
和dcast
可以将其更改为较宽的格式,然后通过管道将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