1

我正在研究我的论文,对 r 知之甚少,所以这个问题的答案可能很明显。

我有一个如下所示的数据集:

county<-c('1001','1001','1001','1202','1202','1303','1303')
naics<-c('423620','423630','423720','423620','423720','423550','423720')
employment<-c(5,6,5,5,5,6,5)
data<-data.frame(county,naics,employment)

对于每个县,我想将行的就业价值与 naics '423620' 和 '423720' 相加。(所以两个条件:1.相同的县代码2.这两个naics代码)添加它们的行应该是第一个('423620'),第二个('423720')应该被删除

最终数据集应如下所示:

county2<-c('1001','1001','1202','1303','1303')
naics2<-c('423620','423630','423620','423550','423720')
employment2<-c(10,6,10,6,5)
data2<-data.frame(county2,naics2,employment2)

我曾尝试用聚合和 rowSum 自己做,但由于这两个条件,我到目前为止都失败了。非常感谢你。

4

2 回答 2

1

我们能做的

library(dplyr)
data$naics <- as.character(data$naics)

data %>%
    filter(naics %in% c(423620, 423720)) %>% group_by(county) %>% 
    summarise(naics = "423620", employment = sum(employment)) %>%
    bind_rows(., filter(data, !naics  %in% c(423620, 423720)))
# A tibble: 5 x 3
#   county  naics employment
#  <fctr>  <chr>      <dbl>
#1   1001 423620         10
#2   1202 423620         10
#3   1303 423620          5
#4   1001 423630          6
#5   1303 423550          6
于 2017-06-11T07:42:19.623 回答
0

在这种情况下,我会先写一个小助手,然后将其传递给 dplyr mutate:

# replace 423720 by 423620 only if both exist
onlyThoseNAICS <- function(v){
  if( ("423620" %in% v) & ("423720" %in% v) ) v[v == "423720"] <- "423620"
  v
}

data %>% 
  dplyr::group_by(county) %>% 
  dplyr::mutate(naics = onlyThoseNAICS(naics)) %>% 
  dplyr::group_by(county, naics) %>% 
  dplyr::summarise(employment = sum(employment)) %>% 
  dplyr::ungroup()
于 2017-06-11T09:38:16.263 回答