[英]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 個不同記錄( 1287025
和1287026
)。 同樣,我不想要 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
,用&
Reduce
其Reduce
到單個向量,並使用它來對數據集的行進行子集
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))
使用igraph
和dplyr
一種選擇是:
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.