如何最好地在 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
- 我们
match
通过 unique(zipcode)
'zipcode' 来获取每个唯一邮政编码的数字索引。
- 使用从 1 开始的索引为每 8 个元素创建另一个索引
%/%
- 2 中的索引用作位置索引,替换为
vector
个值
- 使用 3 的输出作为分组变量
- 获取每个组的第一行 -
slice_head
其中 n = 1
- 使用
pivot_wider
从 '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
以下是示例数据。手头的任务是创建两个新列,它们将通过邮政编码指定某物。第一个新专栏的标题是 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
- 我们
match
通过unique(zipcode)
'zipcode' 来获取每个唯一邮政编码的数字索引。 - 使用从 1 开始的索引为每 8 个元素创建另一个索引
%/%
- 2 中的索引用作位置索引,替换为
vector
个值 - 使用 3 的输出作为分组变量
- 获取每个组的第一行 -
slice_head
其中 n = 1 - 使用
pivot_wider
从 '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