r - 提取数据框中具有重复对的不同行的列位置
问题描述
我有下面的数据框:
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
使这些行不同的那些列名的列位置。
所需的输出应该类似于:
# 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
如您所见,重复的对行因列 C 和 D 不同,它们分别位于主数据集的第 3 和第 4 位置。正如您在下面看到的,唯一需要添加的是基于初始master
数据集的列位置。
#code
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
解决方案
您可以使用 data.table,它具有方便.N
的组大小和.I
行号符号。剩下的就是检查哪些列是不同的,您可以通过sapply
对它们进行 ing 并使用 . 检查唯一元素的数量来完成uniqueN
。
library(data.table)
library(magrittr)
setDT(master)
out <-
master[, .(n = .N,
locs = .(.I),
different = .(names(.SD)[sapply(.SD, uniqueN) != 1]))
, by = .(A, B)] %>%
.[n > 1]
out
# A B n locs different
# 1: 2 3 2 3,4 C,D
# 2: 4 6 2 7,8 C,D
然后你可以position
使用match(different, names(master))
using lapply
,一次走一排。
out[, position := lapply(different, match, names(master))]
out
# A B n locs different position
# 1: 2 3 2 3,4 C,D 3,4
# 2: 4 6 2 7,8 C,D 3,4
推荐阅读
- c# - 如何使用参数从 Access 数据库中保存数字?
- r - 如何在R中按一列拆分表?
- r - 显示组的打印方法
- php - php多数据库备份
- ios - “'React/RCTViewManager.h' 文件未找到”我应该如何添加标题搜索路径?
- vba - VBA F9 按钮已识别 鼠标左键未识别
- javascript - 从 .txt 文件中提取特定数字
- javascript - jQuery $.getJSON 方法给出 CORS 错误
- python-3.x - DistributionNotFound 时导入惊喜
- c++ - 两个随之而来的 std::chrono::high_resolution_clock::now() 给出了~270ns的差异