2014-10-07 88 views
-1

我想知道是否有人在这里能帮助我。我有两个数据帧包含3列:namesgenderamount,两年不同。我希望能够比较每个数据框中名称的起起落落。比较R中两个数据帧的值

预先感谢您!

编辑 -

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" 

我想例如是否比较前10名VALU与2010年数据集相比,2000年数据框的数据增长或下降。有没有一种方法可以计算出两年内名称增加最多的金额?

+0

请发布一些您的数据样本,以及您迄今为止所做的任何尝试。 [请阅读这篇文章](http://whathaveyoutried.com) – Barranka 2014-10-07 19:58:55

+0

我已经编辑了上述内容,以包含我的数据的一个小样本。它返回两个数据框的表格,每个表格列出了当年出生的婴儿的名字,按女性的数量从大到小的顺序排列,然后是男性。对不起,我没有其他的东西了。我真的不知道该从哪里开始:( – Frankj77 2014-10-07 20:27:47

+0

)你的问题现在处于暂停状态,所以它不能得到任何答案。你认为你是别人并问自己:“我能帮助这个人吗?有足够的信息吗?“请阅读:[帮助中心:如何问一个好问题](http://stackoverflow.com/help/How-to-ask)。编辑你的问题并添加一个数据样本(它不我们很乐意提供帮助,但我们需要很好的信息才能开始 – Barranka 2014-10-07 20:46:49

回答

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,这意味着如果增益为正, 的名称是前5名2000年和2010年获得流行的名字是没有进入前5于2000年。如果收益为负, 这些年名列前五名,但受欢迎程度较低。由于我使用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 
+0

我收到错误“错误:不正确的大小(1),期待:44284” – Frankj77 2014-10-08 14:50:10

+0

@ Frankj77我用我的机器再次测试了代码,它正在工作。你可以做的一件事是挑选代码。你可以把每一行加起来看看R是否快乐。例如,你可以运行'rbind(df1,df2)%>%arrange(year,gender,desc(frequency))'看看R返回的结果。如果你看到一个数据框,你想添加另一行,看看R是否快乐。顺便说一句,我使用dplyr 0.3。 – jazzurro 2014-10-08 15:06:27

+0

它与您的示例数据帧完美协作。我认为我的规模太大了,因为当我运行代码的前两行时,出现“尺寸不正确(1),期待:44284”的错误。有没有分配内存空间到数据框的方法,也许这会解决问题? – Frankj77 2014-10-08 15:12:06