我的数据框如下:
master <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8),C=c(5,2,5,7,7,5,7,9,7,8),D=c(1,2,5,3,7,5,9,6,7,0))
如您所见,我有4列A,B,C,D
。我想要实现的是创建一个新的数据框,其中将包括A
和B
之间的重复对行,发生重复的行的索引以及使这些行不同的列名( C,D
,或第三列中的C
和D
)。为了使请求更清楚,我显示了一个示例,其中包含master2
而不是master
,其中仅包含A
和B
master2 <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8))
,然后加上:
library(data.table)
setDT(master2)
master2[master2[, .N, by=names(master2)][ N > 1L ], on=names(master2),
.(N, locs = .(.I)), by=.EACHI]
我得到:
# A B N locs
# 1: 2 3 2 3,4
# 2: 4 6 2 7,8
因此,我希望将此逻辑实现到master
数据帧,并还要添加另一个名为“ Different”的列,其列名使这些行有所不同。如果行与所有行都相同,则具有不同列名的新列应作为值“ nothing”。如果可以添加另一列,且其初始位置为“不同”列。 C是3,D是4?
所需的输出应类似于:
# A tibble: 2 x 4
# Groups: A [?]
# A B n locs different position
# <dbl> <dbl> <int> <chr> <chr> <int>
#1 2 3 2 3, 4 C, D 3,4
#2 4 6 2 7, 8 C, D 3,4
答案 0 :(得分:1)
如果我们需要行索引,则创建一个按感兴趣的列分组的序列列('rn'),仅保留行数大于1的组,[a=1,b=2,c=3]
即可获得行(summarise
)以及该组行序列的n()
ed索引。关于“不同”列,其逻辑尚不完全清楚。这里,是一种基于paste
case_when
基于包含“位置”的评论
library(tidyverse)
master %>%
mutate(rn = row_number()) %>%
group_by(A, B) %>%
filter(n() > 1) %>%
summarise(n = n(),
locs = toString(rn),
Different = case_when(n_distinct(C) > 1 & n_distinct(D) > 1 ~ 'C, D',
n_distinct(C) > 1 ~ 'C',
n_distinct(D) > 1 ~ 'D',
TRUE ~ 'Same'))
# A tibble: 2 x 4
# Groups: A [?]
# A B n locs different
# <dbl> <dbl> <int> <chr> <chr>
#1 2 3 2 3, 4 C, D
#2 4 6 2 7, 8 C, D