按年份排序然后计算每个县的虚拟变量(ddply)

时间:2014-11-22 23:47:51

标签: r dataframe plyr

我正在尝试使用ddply汇总一个非常大的数据帧。

我需要按年份排序,然后在每个县(fips)计算RVPI == 1.我不知道如何在ddply中执行此操作并感谢任何帮助。

以下是示例代码:

Lines <- "year  fips   RVPI  indivID
1950   1001 1 1
1950   1001 1 2    
1950   1001 1 3     
1951   1001 1 3  
1951   1001 1 4  
1951   1002 0 5  
1952  1002  0 6  
1952  1003  0 6  
1952  1004  1 7  
1952  1004  1 7  
1953  1004 1 8 
1953  1006 0 8
1953  1001 1 8
1953  1006 0 9 "

DF <- read.table(text = Lines, check.names = FALSE, header = TRUE)
df <- as.data.frame(DF)

ddply(df, .(year), summarize,
      RVPI = sum(RVPI))

表的预期结果(不完全是上面的例子,但一般而言)

Year     RVPI(# of counties)
1950        1
1951        1
1952        1
1953        2

1 个答案:

答案 0 :(得分:1)

这是使用dplyr的想法。这里我删除了RVPI中有0的行。然后,对于每年,我使用fips为每个distinct选择了一个条目。例如,1950年有三行,fips为1001. distinct只选择其中一行。最后,我计算了每年有多少fips。

library(dplyr)

filter(df, RVPI != 0) %>%
    group_by(year) %>%
    distinct(fips) %>%
    summarise(numOfFips = n())

或者,这会产生相同的结果。

summarise(group_by(df, year, fips), sumRVPI = sum(RVPI)) %>%
    filter(sumRVPI != 0) %>%
    group_by(year) %>%
    summarize(numOfFips = n())

#  year numOfFips
#1 1950         1
#2 1951         1
#3 1952         1
#4 1953         2

如果您尝试在输出中包含indivID,则可以执行以下操作。

filter(df, RVPI != 0) %>%
    group_by(year, fips) %>%
    summarise(numOfIndiv = n()) %>%
    summarise(numOfFips = n(), numOfIndiv = sum(numOfIndiv)) 

#  year numOfFips numOfIndiv
#1 1950         1          3
#2 1951         1          2
#3 1952         1          2
#4 1953         2          2