我有
df1
看起来像这样:
状态 | 邮政编码 | 类型 |
---|---|---|
数控 | 00001 | 人 |
数控 | 00001 | 财产 |
数控 | 00000 | 人 |
数控 | 00001 | 财产 |
我想创建
df2
,其中每个邮政编码都是一个观察值,列计算每个“类型”在每个邮政编码中出现的次数df1
:
邮政编码 | 人 | 财产 |
---|---|---|
00000 | 250 | 45 |
00001 | 115 | 150 |
到目前为止,我创建了
df2
,它是所有唯一邮政编码的列表,并尝试了以下方法,这导致添加了“人”列,但每个值都是相同的数字,是每一行的总和,其中“ person”出现在df1
的整个数据集中。
df2 <- mutate(df2, person = sum(df1$type == "person"))
最终目标是使用 for 循环为每个“类型”创建多个附加列。我尝试了前面的方法以及下面的方法:
for(i in nrow(df2)){
df2 <- mutate(df2, person = sum(df1[i,"type"] == "person"))
}
但是现在,我为每一行添加了零的列。
我这样做的方式正确吗?我该如何解决这个问题?
您可以使用
dplyr::count
后跟 tidy::pivot_wider
:
library(dplyr)
library(tidyr)
df %>%
group_by(zip_code, type) %>%
count() %>%
pivot_wider(names_from = type, values_from = n)
输出:
zip_code person property
<int> <int> <int>
1 12345 1 2
2 54321 1 NA
数据(注意我更改了您的邮政编码只是为了便于识别)
df <- read.table(text = "state zip_code type
NC 12345 person
NC 12345 property
NC 54321 person
NC 12345 property", h = TRUE)