我如何转换其中某些行除一列外重复的数据框

时间:2019-05-29 11:58:46

标签: r

我有关于纳税人的数据,这些纳税人有多个分支机构,这些分支机构会产生多行,除了一个相关列(企业活动)外,几乎都是重复的。我想更改此设置,以使每个纳税人只有一行,这涉及创建列“ enterprise_activity_1”,“ enterprise_activity_2”等。

我意识到这类似于重塑,但是我想不出一种使用tidyr :: spread实现此目的的方法。

为简单起见,假设我们只有一个数据框,例如:

df <- tibble::tibble(
  TAXPAYER_ID = c(100, 151, 250, 250, 267, 296, 296, 304),
  ENTERPRISE_ACTIVITY = rep(c("AGRICULTURE", "MANUFACTURING"), 4)
)

我想实现的是:

TAXPAYER_ID ENTERPRISE_ACTIVITY_1   ENTERPRISE_ACTIVITY_2
100         AGRICULTURE             NA
151         MANUFACTURING           NA
250         AGRICULTURE             MANUFACTURING
267         AGRICULTURE             NA
296         MANUFACTURING           AGRICULTURE
304         MANUFACTURING           NA

我的实际数据中每个纳税人的分支机构数量不同,因此列数应为一个纳税人拥有的最大分支机构数量。

1 个答案:

答案 0 :(得分:0)

基本上,您需要按纳税人ID分组,创建一列以处理重复的标识符和利差,即

library(tidyverse)

df %>% 
  group_by(TAXPAYER_ID) %>% 
  mutate(ENTERPRISE_ACT = row_number()) %>% 
  spread(key = ENTERPRISE_ACT, ENTERPRISE_ACTIVITY, sep = '_')

# A tibble: 6 x 3
# Groups:   TAXPAYER_ID [6]
#  TAXPAYER_ID ENTERPRISE_ACT_1 ENTERPRISE_ACT_2
#        <dbl> <chr>            <chr>           
#1         100 AGRICULTURE      <NA>            
#2         151 MANUFACTURING    <NA>            
#3         250 AGRICULTURE      MANUFACTURING   
#4         267 AGRICULTURE      <NA>            
#5         296 MANUFACTURING    AGRICULTURE     
#6         304 MANUFACTURING    <NA>