我有一个 excel 表,它看起来像:
Col1 Col2
IJ-123 A2B1
IJ-123 A2B1
IJ-456 C2C2
IJ-456 c2c2
IJ-456 D1e2
IJ-789 LJ87
IJ-456
IJ-789 LJ98
x = data.frame(
Col1 = c("IJ-123", "IJ-123", "IJ-456", "IJ-456",
"IJ-456", "IJ-789", "IJ-456", "IJ-789"),
Col2 = c("A2B1", "A2B1", "C2C2", "c2c2",
"D1e2", "LJ87", NA, "LJ98")
)
我想再添加一列并检查(对于每个唯一的
Col2
值)在 Col1
中分配的值是 TRUE
还是 FALSE
。输出:
Col1 Col2 Result
IJ-123 A2B1 TRUE
IJ-123 A2B1 TRUE
IJ-456 C2C2 TRUE
IJ-456 c2c2 TRUE
IJ-456 D1e2 FALSE
IJ-789 LJ87 TRUE (Because Col2 count=1 for this value)
IJ-456 C2C2
IJ-789 LJ98 TRUE (Because Col2 count=1 for this value)
逻辑:
那些 col2 值对应的 col1 值是相同的
但仅针对多次出现的 col2 值的 col1 值。
Col2
,那么 Col1
中的某些字段是空白的值比显示映射到结果中的那些
Col2
的 Col1
值(见第 7 行)。 为此,我有一个 excel 公式
=IF(COUNTIF($B$2:$B$8,B2)=1,SUMPRODUCT(--(($A$2:$A$8=A2)*(COUNTIF($B$2:$B$8,$B$2:$B$8))>1))=0,COUNTIFS($B$2:$B$8,B2,$A$2:$A$8,"<>"&A2)=0)
但它的工作速度非常慢,因为等待了大约 4 个小时,它只完成了大约 20 万条数据的 28% 处理。我已将
csv
格式的文件上传到 R 上,并希望在 R 上执行相同的练习以加快处理速度。
最佳答案
试试 dplyr:
require(dplyr)
x$Col2 <- toupper(x$Col2) #make all letters same case.
x_assigned <- x %>% group_by(Col2,Col1) %>%
summarise(n = n()) %>% #counts the number of occurrences
group_by(Col1) %>% arrange(desc(n)) %>% # arranges so that the highest count per Col1 is first
mutate(assigned = if (first(n) == 1) { #this conditional statement will assign the 'correct' Col2 value to your Col1 value
Col2
} else if (first(n) > 1) {
first(Col2)
},
test = assigned == Col2)
x_assigned
# A tibble: 6 x 5
# Groups: Col1 [3]
Col2 Col1 n assigned test
<chr> <chr> <int> <chr> <lgl>
1 A2B1 I-123 2 A2B1 T
2 C2C2 I-456 2 C2C2 T
3 D1E2 I-456 1 C2C2 F
4 LJ87 I-789 1 LJ87 T
5 LJ98 I-789 1 LJ98 T
6 <NA> I-456 1 C2C2 NA
为了获得所需的结果,您可以对 x 和 x_assigned 进行简单的左连接:
left_join(x, x_assigned, by = c('Col1', 'Col2'))
您可以通过这种方式查看缺失值的位置,还可以轻松分配“正确”的 Col2 值。抱歉,如果我误解了您的问题,我仍然不确定您如何将“正确”的 Col2 值分配给 Col1 值
关于r - 检查每个具有相同唯一 ID 的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48849294/