Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的data.frame中查找仅出现在一个集群中的变量_R_List_Function_Dataframe_Lapply - Fatal编程技术网

在R中的data.frame中查找仅出现在一个集群中的变量

在R中的data.frame中查找仅出现在一个集群中的变量,r,list,function,dataframe,lapply,R,List,Function,Dataframe,Lapply,使用BASE R,我想知道如何回答以下问题: 在X或Y(即感兴趣的变量名称)上是否有任何值只出现在m中的一个元素中(作为一个簇),而不出现在其他元素中?如果是,请在下面生成我的所需输出 例如: 这里我们看到X==3只出现在元素m[[3]]中,而不是m[[1]]和m[[2]]。 在这里,我们还看到Y==99只出现在m[[1]]中,而不出现在其他地方 注意:以下是一个玩具示例,请给出功能性答案。和X和Y可以是数字,也可以不是数字(例如,是字符串) 这是一个基于rappy()和table()的解决方案

使用BASE R,我想知道如何回答以下问题:

X
Y
(即感兴趣的变量名称)上是否有任何值只出现在
m
中的一个元素中(作为一个簇),而不出现在其他元素中?如果是,请在下面生成我的所需输出

例如: 这里我们看到
X==3
只出现在元素
m[[3]]
中,而不是
m[[1]]
m[[2]]
。 在这里,我们还看到
Y==99
只出现在
m[[1]]
中,而不出现在其他地方

注意:以下是一个玩具示例,请给出功能性答案。和
X
Y
可以是数字,也可以不是数字(例如,是字符串)


这是一个基于
rappy()
table()
的解决方案


ux这是一个基于
rappy()
table()
的解决方案


ux这利用了@jay.sf的
rapply()
思想和来自以下领域的思想:


vec这利用了@jay.sf的
rapply()
思想和来自以下领域的思想:

vec
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 
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
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
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