如何最好地在 R 中创建计算列

How best to create calculated columns in R

以下是示例数据。手头的任务是创建两个新列,它们将通过邮政编码指定某物。第一个新专栏的标题是 Las_Vegas,第二个是 Laughlin。对于 Las Vegas,前八个邮政编码的值为 1,对于 Laughlin,后八个邮政编码的值为 1。这样做的目的是想把Las Vegas和Laughlin的就业加起来。

第一个问题:使用 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)

最终结果。这个最终结果将有十六行。为了简单起见,我保持简短。 Las_Vegas 一行,Laughlin 一行,但 Las_Vegas 有八行,Laughlin 有八行。我知道如何做 summarize(求和求职),但是很难做两栏。

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

我们可以使用tidyverse

  1. 我们 match 通过 unique(zipcode) 'zipcode' 来获取每个唯一邮政编码的数字索引。
  2. 使用从 1 开始的索引为每 8 个元素创建另一个索引 %/%
  3. 2 中的索引用作位置索引,替换为 vector 个值
  4. 使用 3 的输出作为分组变量
  5. 获取每个组的第一行 - slice_head 其中 n = 1
  6. 使用 pivot_wider
  7. 从 'long' 重塑为 'wide'
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

如果我们想要 return 所有行,那么不要执行 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