首先 - 我查看了其他问题和答案,我找不到唯一能解决这个问题的问题。如果我错了,请指出我的答案。
我的数据如下:
df <- data.frame(key=c('1', '2', '3', '4', '5'),
name1=c('black','black','black','red','red'),
type1=c('chair','chair','sofa','sofa','plate'),
num1=c(4,5,12,4,3),
name2=c('black', 'red', 'black', 'green', 'blue'),
type2=c('chair','chair','sofa','bed','plate'),
num2=c(4,7,12,3,1),
name3=c('blue', 'green', 'black', 'blue', 'blue'),
type3=c('couch','chair','sofa','plate','plate'),
num3=c(12,8,12,4,1))
key | name1 | type1 | num1 | name2 | type2 | num2 | name3 | type3 | num3
------------------------------------------------------------------------
1 black chair 4 black chair 4 blue couch 12
2 black chair 5 red chair 7 green chair 8
3 black sofa 12 black sofa 12 black sofa 12
4 red sofa 4 green bed 3 purple bowl 4
5 red plate 3 blue plate 1 blue plate 1
对于一个主键,有一组数据,都在同一行上。
我需要:
因此,根据上述数据,我想在右侧添加
key | dupes | N_d_1 | name_d_1 | type_d_1 | num_d_1 | ...N_d_X
1 1 2 black chair 4
2 0 0 NA NA NA
3 1 3 black sofa 12
4 0 0 NA NA NA
5 1 2 blue plate 1
并发症 -
有近100组,每组9列,并且会有多组重复。我需要看到这些值,所有这些值以及欺骗总和需要考虑这些不同的重复组。
我可以使用庞大的IF name_d_1 == name_d_X&amp;类型等,但我认为有一个更短的更快的方法来做到这一点,我不知道。输出可能应该是一个单独的数据框,它包含每个键,但只能为重复项提取和生成变量... R已经有太多列可以有效地处理。
感谢任何帮助,谢谢。
答案 0 :(得分:1)
以下是使用dplyr
:
library(dplyr)
group_len <- 3
groups <- split(2:ncol(df), cut(2:ncol(df), 3))
stacked.df <- do.call(rbind, lapply(groups, function(cols) {
group <- df[ , c(1, cols)]
names(group) <- c("key", "name", "type", "num")
group
}))
group_by(stacked.df, key, name, type, num) %>%
summarise(dupes = n() > 1, num_dupes = n())
这会以长篇形式提供您想要的数据:
# A tibble: 11 x 6
# Groups: key, name, type [?]
key name type num dupes num_dupes
<fct> <fct> <fct> <dbl> <lgl> <int>
1 1 black chair 4.00 T 2
2 1 blue couch 12.0 F 1
3 2 black chair 5.00 F 1
4 2 red chair 7.00 F 1
5 2 green chair 8.00 F 1
6 3 black sofa 12.0 T 3
7 4 red sofa 4.00 F 1
8 4 blue plate 4.00 F 1
9 4 green bed 3.00 F 1
10 5 red plate 3.00 F 1
11 5 blue plate 1.00 T 2
要按照您的要求将其扩展为广泛形式,我建议您查看tidyr
的{{1}}函数或spread
的{{1}}函数。