2016-09-26 107 views
2

我想创建一个计数变量,每个给定年份中Z == 0的人数。如下图所示:在R中创建一个条件计数变量

PersonID Year Z Count* 
     1 1990 0 1 
     2 1990 1 1 
     3 1990 1 1 
     4 1990 2 1 
     5 1990 1 1 
     1 1991 1 3 
     2 1991 0 3 
     3 1991 1 3 
     4 1991 0 3 
     5 1991 0 3 
     1 1992 NA 1 
     2 1992 2 1 
     3 1992 2 1 
     4 1992 0 1 
     5 1993 1 0 
     1 1993 1 0 
     2 1993 2 0 
     3 1993 NA 0 
     4 1993 1 0 
     5 1994 0 5 
     1 1994 0 5 
     2 1994 0 5 
     3 1994 0 5 
     4 1994 0 5 

我看了看我以前的R-剧本,发现这个

library(dplyr) 
sum_data <- data %>% group_by(PersonID) %>% summarise(Count = sum(Z, na.rm=T)) 

有人可以帮助我得到这个权利?计数变量基本上应该计算Z == 0的总人数,格式与上面所示的相同。谢谢!!

dput(data) 
structure(list(PersonID = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 
5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L), 
    Year = c(1990L, 1990L, 1990L, 1990L, 1990L, 1991L, 1991L, 
    1991L, 1991L, 1991L, 1992L, 1992L, 1992L, 1992L, 1993L, 1993L, 
    1993L, 1993L, 1993L, 1994L, 1994L, 1994L, 1994L, 1994L), 
    Z = c(0L, 1L, 1L, 2L, 1L, 1L, 0L, 1L, 0L, 0L, NA, 2L, 2L, 
    0L, 1L, 1L, 2L, NA, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("PersonID", 
"Year", "Z"), class = "data.frame", row.names = c(NA, -24L)) 
+1

你需要'mutate'而不是总结,你需要指定要计算'ž== 0'。 – Sotos

+1

看到下面的答案后,我必须回答。因为我确信这是一个骗局,我会留下我的答案作为一个评论︰'data%>%group_by(Year)%>%mutate(count = sum(Z == 0,na.rm = TRUE))' – Sotos

+0

@Sotos正确答案 - 非常感谢。让我知道如果这是一个dup,我会把它拿下来。 – Boris

回答

1

这里有一个简单的解决方案:

library(dplyr) 

sum_data <- df %>% 
    mutate(Z=replace(Z, is.na(Z), 1)) %>% 
    mutate(temp = ifelse(Z == 0, 1, 0)) %>% 
    group_by(Year) %>% 
    summarize(count = sum(temp)) 

基本上这就是代码的作用:

  • mutate(Z=replace(Z, is.na(Z), 1)) 1(可选)
  • mutate(temp = ifelse(Z == 0, 1, 0))更换NA创造条件temp variable:
  • ifelse(Z == 0, 1, 0)说如果Z == 0,则该值是1 否则为0
  • group_by(Year)漂亮explicite :)它组由 年份
  • summarize(count = sum(temp))数据帧创建一个计数变量与 总和之前生成临时

结果:

Year count 
    <int> <int> 
1 1990  5 
2 1991  5 
3 1992  4 
4 1993  5 
5 1994  5 

,如果你想加入这个数据到原始数据帧只需要使用连接:

left_join(df, sum_data) 
Joining, by = "Year" 
    PersonID Year Z count 
1   1 1990 0  1 
2   2 1990 1  1 
3   3 1990 1  1 
4   4 1990 2  1 
5   5 1990 1  1 
6   1 1991 1  3 
7   2 1991 0  3 
8   3 1991 1  3 
9   4 1991 0  3 
10  5 1991 0  3 
11  1 1992 NA  1 
12  2 1992 2  1 
13  3 1992 2  1 
14  4 1992 0  1 
15  5 1993 1  0 
16  1 1993 1  0 
17  2 1993 2  0 
18  3 1993 NA  0 
19  4 1993 1  0 
20  5 1994 0  5 
21  1 1994 0  5 
22  2 1994 0  5 
23  3 1994 0  5 
24  4 1994 0  5 
+0

谢谢乔纳斯。我不清楚你实际指定了哪些条件(例如Z == 0)。我将在Z = 1或其他任何地方创建类似的变量。 – Boris

+0

编辑清楚的答案:)让我知道如果您有任何问题 –

+0

乔纳斯:谢谢! +1(我从索托斯得到了正确的答案) – Boris

1

试试这个:

library(dplyr) 
df <- left_join(data, data %>% filter(Z==0) %>% group_by(Year) %>% summarise(Count = n())) 
df[is.na(df$Count),]$Count <- 0 


PersonID Year Z Count 
1   1 1990 0  1 
2   2 1990 1  1 
3   3 1990 1  1 
4   4 1990 2  1 
5   5 1990 1  1 
6   1 1991 1  3 
7   2 1991 0  3 
8   3 1991 1  3 
9   4 1991 0  3 
10  5 1991 0  3 
11  1 1992 NA  1 
12  2 1992 2  1 
13  3 1992 2  1 
14  4 1992 0  1 
15  5 1993 1  0 
16  1 1993 1  0 
17  2 1993 2  0 
18  3 1993 NA  0 
19  4 1993 1  0 
20  5 1994 0  5 
21  1 1994 0  5 
22  2 1994 0  5 
23  3 1994 0  5 
24  4 1994 0  5 
+0

谢谢 - 我在同样的例子中试过,但在1992年得到了NA。我使用了相同的代码。 – Boris

+0

你是对的,它具有1993年(不是1992年)的NA值,因为那年没有Z == 0,更新了代码,现在应该没问题,实际上是1993年。 –