考虑一下:
df1 <- data.frame(
row.names = c('Obs1','Obs2','Obs3','Obs4'),
V1 = c(1,2,1,0),
V2 = c(0,0,1,0),
V3 = c(1,1,0,3))
df2 <- data.frame(
Group = c("A", "A", "B"),
Obs = c("Obs1", "Obs2", "Obs3"))我希望将组成df2的每个Group的观察值与df1中的每个变量进行匹配,并返回一个描述观察值是否存在的数据帧-最终能够对df1的变量应该包含在哪些Group中进行分类。组成Group的所有观测值在df1中必须大于0,df1中的变量才能被视为Group的一部分。
output
Group V1 V2 V3
1 A 1 0 1
2 B 1 1 0发布于 2017-03-23 08:07:32
这里有一个快速的方法:
library(dplyr)
df1$Obs <- rownames(df1) # rownames are a pain, let's have a real column
# complains because of a factor in df1, but no biggie:
output <- inner_join(df1, df2)
output %>%
group_by(Group) %>%
summarize_at(
vars(starts_with('V')),
function (x) as.numeric(any(x>0))
)这将提供所需的输出。
发布于 2017-03-23 11:30:09
这是一个使用data.table连接“Obs/rn”上的两个数据集的选项,按“Group”分组,检查列中值的any是否大于0
library(data.table)
setDT(df1, keep.rownames=TRUE)[df2, on = .(rn = Obs)
][, lapply(.SD, function(x) +any(x > 0)) , Group, .SDcols = V1:V3]
# Group V1 V2 V3
#1: A 1 0 1
#2: B 1 1 0https://stackoverflow.com/questions/42964690
复制相似问题