簡體   English   中英

查找具有唯一值組合的行 (R)

[英]Finding rows with a unique combination of values (R)

這比標題更復雜一些,我敢肯定,如果我能想出一種更好的方法來描述它,我可以更好地在谷歌上搜索它。

我有看起來像這樣的數據:

SET                     ID    
100301006              1287025
100301006              1287026
100301010              1287027
100301013              1287030
100301011              1287027

並且我想識別並選擇那些行中的每個值都具有該列的唯一值的行。 在上面的示例中,我只想獲取行:

100301013              1287030

我不想要SET 100301006 ,因為它匹配 ID 字段中的 2 個不同記錄( 12870251287026 )。 同樣,我不想要 SET 100301010因為它匹配的ID記錄( 1287027 )也可以匹配另一個 SET ( 10030011 )。

在某些情況下,可能會有 2 個以上的匹配項。

我可以在循環中做到這一點,但這似乎是一個黑客。 我喜歡基本的 R 或 data.table 解決方案,但我對 dplyr 不太感興趣(試圖最小化依賴性)。

這是一個快速的 base-R hack:

df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
SET                     ID    
100301006              1287025
100301006              1287026
100301010              1287027
100301013              1287030
100301011              1287027")

counts <- sapply(df, function(x) { tb <- table(x); tb[ match(x, names(tb)) ]; })
counts
#           SET ID
# 100301006   2  1
# 100301006   2  1
# 100301010   1  2
# 100301013   1  1
# 100301011   1  2

在這一點上,我們有每個元素在其列中被找到的次數……所以我們想要所有計數都為 1 的行。

df[ rowSums(counts == 1) == ncol(df), ]
#         SET      ID
# 4 100301013 1287030

我們可以在每一列上獨立使用duplicated來創建一個邏輯vector list ,用& ReduceReduce到單個向量,並使用它來對數據集的行進行子集

df1[Reduce(`&`, lapply(df1, function(x) 
         !(duplicated(x)|duplicated(x, fromLast = TRUE)))),]
#     SET      ID
#4 100301013 1287030

或者像@chinsoon12 建議的那樣

 m1 <- sapply(df1, function(x) !(duplicated(x)| duplicated(x, fromLast = TRUE)))
 df1[rowSums(m1) == ncol(m1),, drop = FALSE]

數據

df1 <- structure(list(SET = c(100301006L, 100301006L, 100301010L, 100301013L, 
100301011L), ID = c(1287025L, 1287026L, 1287027L, 1287030L, 1287027L
)), class = "data.frame", row.names = c(NA, -5L))

使用igraphdplyr一種選擇是:

clusters(graph.data.frame(df))$membership %>%
 enframe() %>%
 group_by(value) %>%
 filter(n() == 2)

  name      value
  <chr>     <dbl>
1 100301013     3
2 1287030       3

它返回未連接到另一個值的值對。

使用base R ,也許您可​​以使用ave()來制作它:

r <-df[which(with(df,ave(seq(nrow(df)),SET,FUN = length)*ave(seq(nrow(df)),ID,FUN = length)) == 1),]
> r
        SET      ID
4 100301013 1287030

數據

df <- read.table(text="SET                     ID    
100301006              1287025
100301006              1287026
100301010              1287027
100301013              1287030
100301011              1287027",header = T)

您可以使用 data.table 僅選擇具有 1 行的組,首先按 ID 分組,然后按 SET。 這類似於 @r2evans 檢查 ID 和 SET 的計數是否都是 1 的方法。

library(data.table)
setDT(df)

df[, if(.N == 1) .SD, ID][, if(.N == 1) .SD, SET]

#          SET      ID
# 1: 100301013 1287030

或超過 2 列

Reduce(function(x, y) x[, if(.N == 1) .SD, y], names(df), init = df)
#         ID       SET
# 1: 1287030 100301013

如果我們有一個數據框df並且想要找到列的唯一值: column1, column2, column3

library(dplyr)
df <- df %>% group_by(column1,column2,column3) %>% summarise()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM