比较R中两个数据帧的值

时间:2014-10-07 19:51:25

标签: r dataframe

我想知道这里是否有人可以帮助我。我有两个包含3列的数据框:namesgender amount,两年不同。我希望能够比较每个数据框中名称的上升和下降。

提前谢谢!

编辑 -

d=read.table("names2000.txt",header=FALSE,sep=",") 
colnames(d)=c('name','gender','amount') 

这提供了年份2000的数据。然后我使用do.call(rbind, by(d, list(d$gender), FUN=head,5))查找返回的前5名男性和女性姓名

   name gender amount
F.1       Linda   F  80412
F.2        Mary   F  65443
F.3    Patricia   F  47920
F.4     Barbara   F  41560
F.5       Susan   F  38019
M.6107    James   M  86139
M.6108   Robert   M  83534
M.6109     John   M  79396
M.6110  Michael   M  65141
M.6111    David   M  60704

对于我使用的第二个数据框

j=read.table("names2010.txt",header=FALSE,sep=",") 
    colnames(j)=c('name','gender','amount')

这会返回年度数据' 2010'我尝试再次使用do.call(rbind, by(d, list(d$gender), FUN=head,5))查找今年男性和女性的前5名,但我收到了错误消息

> "Error in tapply(seq_len(33983L), list(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
> 1L,  :    arguments must have same length"

我想比较一下,与2010年数据相比,2000年数据框中的前10个名称值是上升还是下降。有没有办法确定两年之间名字的数量增加最多?

1 个答案:

答案 0 :(得分:0)

我创建了两个伪数据帧。如果您可以从下次提供完整的数据集,那就太棒了。在这里,我结合了两个数据名称,按年份和性别划分了前五名,并最终计算了收益(增加/减少)。

library(dplyr)

df1 <- data.frame(
        names = c("Ana", "Beth", "Caroline", "Diana", "Ellen",
                  "Felicity", "Grace", "Happy", "Irine", "Jasmin",
                  "Andrew", "Bob", "Cabal", "Dan", "Edward",
                  "Fred", "Greg", "Hugh", "Illia", "Jacob"),
        gender = rep(c("F", "M"), each = 10),
        frequency = sample.int(1e6, 20, replace = TRUE),
        year = 2000,
        stringsAsFactors = FALSE)


df2 <- data.frame(
        names = c("Ana", "Beth", "Caroline", "Diana", "Ellen",
                  "Felicity", "Grace", "Happy", "Irine", "Jasmin",
                  "Andrew", "Bob", "Cabal", "Dan", "Edward",
                  "Fred", "Greg", "Hugh", "Illia", "Jacob"),
        gender = rep(c("F", "M"), each = 10),
        frequency = sample.int(1e6, 20, replace = TRUE),
        year = 2010,
        stringsAsFactors = FALSE)

foo <- rbind(df1,df2)%>%
       arrange(year, gender, desc(frequency)) %>% # Sort your data by the three columns
       group_by(year, gender) %>%
       filter(row_number() < 6) %>% # pick up the top 5 names by year and gender
       ungroup() %>%
       group_by(names) %>%
       mutate(gain = frequency - lag(frequency)) %>% # calculate increase/decrease 
       ungroup() %>%
       filter(year == 2010) # select top 5 names from 2010, NA means the name was not in top 5 in 2000.

如果增益为NA,则表示名称在2000年不在前5名。如果获得为正, 这些名字在2000年和2010年都名列前五,并且越来越受欢迎。如果增益为负, 这些名字在这些年里排在前5位,但却不那么受欢迎了。因为我使用了sample.int, 你的结果会有所不同。

#      names gender year frequency    gain
#1       Ana      F 2010    934706      NA
#2     Irine      F 2010    869691  240576
#3  Caroline      F 2010    651674      NA
#4  Felicity      F 2010    386115 -512275
#5     Happy      F 2010    382388 -278410
#6    Edward      M 2010    827374   57532
#7      Greg      M 2010    794240   76621
#8     Illia      M 2010    723711      NA
#9      Fred      M 2010    668467      NA
#10      Bob      M 2010    599566      NA
相关问题