如何通过另一个数据帧中的分组观察来匹配一个数据帧中的变量

时间:2017-03-22 23:43:30

标签: r

考虑:

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"))

我希望将Group df2的每个df1的观察值与Group中的每个变量相匹配,并返回描述观察是否存在的数据框 - 最终成为能够分类df1的{​​{1}}变量应该包括在内。构成Group的所有观察必须具有值&gt; df1中的df1中的变量被视为Group的一部分。{/ p>

output
      Group V1 V2 V3
1         A  1  0  1
2         B  1  1  0

2 个答案:

答案 0 :(得分:1)

这是一个快速的方法:

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

这将提供您所需的输出。

答案 1 :(得分:1)

以下是一个使用data.table加入&#39; Obs / rn&#39;的两个数据集的选项,按&#39; Group&#39;分组,检查any是否为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 0

中的值大于0
NVARCHAR