【问题标题】:How best to create calculated columns in R如何最好地在 R 中创建计算列
【发布时间】:2021-09-07 06:41:39
【问题描述】:

以下是示例数据。手头的任务是创建两个新列,它们将通过邮政编码指定某些东西。第一个新列的标题是 Las_Vegas,第二个是 Laughlin。对于 Las Vegas,前八个邮政编码的值为 1,对于 Laughlin,后八个邮政编码的值为 1。这样做的目的是想总结一下拉斯维加斯和劳克林的就业情况。

第一个问题:使用 ifelse 还是 case_when 最好? 第二个问题:将两个新列变成事实上的虚拟变量……这是最好的方法吗?

  zipcode <-c(89102,89103,89104,89105,89106,89107,89108,89109,89110,89111,89112,89113,89114,89115,89116,89117)
  naicstest<-c(541213,541213,541213,541213,541213,541213,541213,541213,541213,541213,541213,541213,541213,541212,541215,541214)
  emptest <-c(2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32)


  county <- data.frame(zipcode,naicstest,emptest)

最终结果。这个最终结果将有 16 行。为了简单起见,我保持简短。 Las_Vegas 为 1 行,Laughlin 为 1 行,但 Las_Vegas 为 8 行,Laughlin 为 8 行。我知道如何进行总结(总结就业),但很难做到这两列。

  zipcode     naicstest     emptest    Las_Vegas     Laughlin
    89102       541213         2           1             0
    89110       541213         18            0             1

【问题讨论】:

    标签: r if-statement dplyr case-when


    【解决方案1】:

    我们可以使用tidyverse

    1. 我们matchunique(zipcode) 的“邮政编码”以获取每个唯一邮政编码的数字索引。
    2. 使用从 1 开始的索引为带有%/% 的每 8 个元素创建另一个索引
    3. 从 2 开始的索引用作位置索引,替换为值的vector
    4. 使用 3 的输出作为分组变量
    5. 获取每个组的第一行 - slice_head,n = 1
    6. 使用pivot_wider 将“长”重塑为“宽”
    library(dplyr)
    library(tidyr)
    county %>%
        group_by(un1 = c("Las_Vegas", "Laughlin")[
            (match(zipcode, unique(zipcode)) -1) %/% 8 + 1]) %>%
        slice_head(n = 1) %>%
        mutate(n = 1) %>% 
        pivot_wider(names_from = un1, values_from = n, values_fill = 0)
    

    -输出

    # A tibble: 2 x 5
      zipcode naicstest emptest Las_Vegas Laughlin
        <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
    1   89102    541213       2         1        0
    2   89110    541213      18         0        1
    

    如果我们想返回所有的行,那么不要做slice_head,而是创建一个序列列 - row_number()

    county %>%
        group_by(un1 = c("Las_Vegas", "Laughlin")[
            (match(zipcode, unique(zipcode)) -1) %/% 8 + 1]) %>%    
        mutate(n = 1, rn = row_number()) %>%
        ungroup %>% 
        pivot_wider(names_from = un1, values_from = n, values_fill = 0) %>% 
        select(-rn)
    

    -输出

    # A tibble: 16 x 5
       zipcode naicstest emptest Las_Vegas Laughlin
         <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
     1   89102    541213       2         1        0
     2   89103    541213       4         1        0
     3   89104    541213       6         1        0
     4   89105    541213       8         1        0
     5   89106    541213      10         1        0
     6   89107    541213      12         1        0
     7   89108    541213      14         1        0
     8   89109    541213      16         1        0
     9   89110    541213      18         0        1
    10   89111    541213      20         0        1
    11   89112    541213      22         0        1
    12   89113    541213      24         0        1
    13   89114    541213      26         0        1
    14   89115    541212      28         0        1
    15   89116    541215      30         0        1
    16   89117    541214      32         0        1
    

    【讨论】:

    • @TimWilcox 我更新了帖子。我想这就是你可能需要的
    • 如果我想手动指定邮政编码怎么办。我有一个更大的数据集,其中包含 1,000 个或更多的实际邮政编码。只关注其中的 16 个。
    • @TimWilcox 只需在group_by 步骤之前对感兴趣的邮政编码进行子集化,即county %&gt;% filter(zipcode %in% yourvectorofzipcode) %&gt;%
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多