【发布时间】:2020-03-07 11:14:24
【问题描述】:
受this answer 的启发,我的目标是在m 的data.frames 集群中找到仅特定于一个m(例如m[[15]])而不是其他ms 的变量。
例如,我知道变量genre == 4 仅特定于m[[15]](“Fazio”即names(m)[15]),而genre == 4 不会出现在任何其他m 集群中(由@ 确认987654331@).
因此,我希望我的输出给我命名 "Fazio" 和 genre == 4 。
我想对mods 中显示的所有变量重复此过程,而不仅仅是genre?
我尝试了以下方法但没有成功:
d <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/v.csv", h = T) # DATA
mods <- c("genre","cont.type","time","cf.timely","ssci","setting","ed.level", # mods
"Age","profic","motivation","Ss.aware","random.grp","equiv.grp",
"rel.inter","rel.intra","sourced","timed","Location",
"cf.scope","cf.type","error.key","cf.provider","cf.revision","cf.oral",
"Length","instruction","graded","acc.measure","cf.training","error.type")
m <- split(d, d$study.name) # `m` clusters of data.frames
# SOLUTION TRIED:
tmp = do.call(rbind, lapply(mods, function(x){
d = unique(d[c("study.name", x)])
names(d) = c("study.name", "val")
transform(d, nm = x)
}))
# this logic may need to change:
tmp = tmp[ave(as.numeric(as.factor(tmp$val)), tmp$val, FUN = length) == 1,]
lapply(split(tmp, tmp$study.name), function(a){
setNames(a$val, a$nm)
}) # doesn't return anything
【问题讨论】:
-
是否需要按
mod分组,即tmp[with(tmp, ave(val, val, nm, FUN = length)==1),] -
逻辑是根据'val'和'nm'即mods列过滤'val'中唯一元素长度为1的行
-
但这只是分成列表,而你想要别的东西?
tmp1 <- tmp[with(tmp, ave(val, val, nm, FUN = length)==1),]; split(tmp1, tmp1$study.name, drop = TRUE)
标签: r list function loops dataframe