这从2天开始困扰着我。
我有类似
的数据 Account.ID asset_name
6yS A
6yS B
6yS B
6yS C
6yU D
876 C
在这里,我想制作更多类似假人的栏目。但是我每个ID只需要一行。
我的输出应该像这样
Account.ID asset_name Flag_A Flag_B Flag_C Flag_D
6yS A 1 2 1 0
6yU D 0 0 0 1
876 C 0 0 1 0
我尝试进行汇总,但是它们将其放入另一个表中,我不想再次合并,因为我将丢失信息。
请帮帮我。 预先感谢您。
答案 0 :(得分:3)
这个吗?
[Route]
答案 1 :(得分:3)
您可以将dcast
中的data.table
与fun.aggregate
参数一起使用:
library(data.table)
dcast(data = setDT(df)[, asset_name := paste0('Flag_', asset_name)],
formula = Account.ID ~ asset_name,
fun.aggregate = length)
输出:
Account.ID Flag_A Flag_B Flag_C Flag_D
1: 6yS 1 2 1 0
2: 6yU 0 0 0 1
3: 876 0 0 1 0
答案 2 :(得分:1)
这不是最优雅的解决方法。
Account.ID <- c('6yS', '6yS', '6yS', '6yS', '6yU', '876')
asset_name <- c('A','B','B','C','D','C')
df <- data.frame(Account.ID, asset_name)
df <- df %>%
group_by(Account.ID, asset_name) %>%
summarise(Count = n()) %>%
spread(key = asset_name, value = Count, fill = 0)
返回:
Account.ID A B C D
<fct> <dbl> <dbl> <dbl> <dbl>
1 6yS 1 2 1 0
2 6yU 0 0 0 1
3 876 0 0 1 0
答案 3 :(得分:0)
我想我有一个答案。这是您的数据集:
Account.ID <- c("6yS", "6yS", "6yS", "6yS", "6yU", 876)
asset_name <- c("A", "B", "B", "C", "D", "C")
df <- data.frame(Account.ID, asset_name)
df
Account.ID asset_name
1 6yS A
2 6yS B
3 6yS B
4 6yS C
5 6yU D
6 876 C
对于进一步的转换,我正在使用tidyverse,因此请安装并加载库:
install.packages("tidyverse")
library(tidyverse)
df <-df %>%
group_by(Account.ID, asset_name) %>%
summarize(n=n()) %>%
spread(asset_name, n)
df
# A tibble: 3 x 5
# Groups: Account.ID [3]
Account.ID A B C D
<fct> <int> <int> <int> <int>
1 6yS 1 2 1 NA
2 6yU NA NA NA 1
3 876 NA NA 1 NA
现在所需要做的就是将NA设置为0并重命名列:
df[is.na(df)] <- 0
names(df)[2:ncol(df)] <- paste0("Flag_", names(df)[2:ncol(df)])
df
# A tibble: 3 x 5
# Groups: Account.ID [3]
Account.ID Flag_A Flag_B Flag_C Flag_D
<fct> <dbl> <dbl> <dbl> <dbl>
1 6yS 1 2 1 0
2 6yU 0 0 0 1
3 876 0 0 1 0
这是您要找的吗?