【问题标题】:How do I convert a data frame where some rows are duplicates except for one column [duplicate]如何转换除一列之外的某些行重复的数据框[重复]
【发布时间】:2019-05-29 11:58:46
【问题描述】:

我有关于纳税人的数据,这些分支机构有多个分支机构,这些分支机构产生多行,除了一个相关列(企业活动)之外几乎是重复的。我想改变这一点,使每个纳税人只有一行,这涉及创建列 '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

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

【问题讨论】:

  • 感谢您指出该问题,但这与我的数据不完全相同,因为我的数据没有为纳税人中的每个分支提供索引的列。但是,如果我可以创建该索引,那么我可以像在那个问题中一样直接使用 tidyr::spread。

标签: r


【解决方案1】:

基本上你需要按纳税人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>      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2018-02-14
    • 2023-02-25
    相关资源
    最近更新 更多