使用BASE R,我想知道如何回答以下问题:
X
或Y
上是否有任何值仅出现在m
中的一个元素(作为簇)中而不是其他元素中?如果是,请在下面显示我的所需输出。
例如:
在这里,我们看到X == 3
仅出现在元素m[[3]]
中,而没有出现在m[[1]]
和m[[2]]
中。
在这里,我们还看到Y == 99
仅出现在m[[1]]
中,而没有出现。
注意:以下是一个玩具示例,感谢您提供实用的答案。 AND X
和Y
可以是数字,也可以不是数字(例如,是字符串)。
f <- data.frame(id = c(rep("AA",4), rep("BB",2), rep("CC",2)), X = c(1,1,1,1,1,1,3,3),
Y = c(99,99,99,99,6,6,6,6))
m <- split(f, f$id) # Here is `m`
mods <- names(f)[-1] # variables of interest names
所需的输出:
list(AA = c(Y = 99), CC = c(X = 3))
# $AA
# Y
# 99
# $CC
# X
# 3
答案 0 :(得分:2)
这是基于rapply()
和table()
的解决方案。
ux <- rapply(m, unique)
tb <- table(uxm <- ux[gsub(rx <- "^.*\\.(.*)$", "\\1", names(ux)) %in% mods])
r <- Map(setNames, n <- uxm[uxm %in% names(tb)[tb == 1]], gsub(rx, "\\1", names(n)))
setNames(r, gsub("^(.*)\\..*$", "\\1", names(r)))
# $AA
# Y
# 99
#
# $CC
# X
# 3
答案 1 :(得分:1)
tmp = do.call(rbind, lapply(names(f)[-1], function(x){
d = unique(f[c("id", x)])
names(d) = c("id", "val")
transform(d, nm = x)
}))
tmp = tmp[ave(as.numeric(as.factor(tmp$val)), tmp$val, FUN = length) == 1,]
lapply(split(tmp, tmp$id), function(a){
setNames(a$val, a$nm)
})
#$AA
# Y
#99
#$BB
#named numeric(0)
#$CC
#X
#3
答案 2 :(得分:1)
这利用了@ jay.sf的rapply()
和previous answer的想法:
vec <- rapply(lapply(m, '[', , mods), unique)
unique_vec <- vec[!duplicated(vec) & !duplicated(vec, fromLast = T)]
vec_names <- do.call(rbind, strsplit(names(unique_vec), '.', fixed = T))
names(unique_vec) <- vec_names[, 2]
split(unique_vec, vec_names[, 1])
$AA
Y
99
$CC
X
3