我有两个2x2数据帧。每个数据框中的每一列都是一个因子。
我想创建一个2x8数据框,其中包含每个因素以及因子之间的相互作用。
以下是一个例子:
df1 <- data.frame(V1 = factor(c('a', 'b')), V2 = factor(c('c', 'd')))
df2 <- data.frame(V3 = factor(c('e', 'f')), V4 = factor(c('g', 'h')))
df.combined <- combine(df1, df2)
df.combined
将在哪里
V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
a c e g a:e a:g c:e c:g
b c f h b:f b:h d:f d:h
(我不希望V1:V2或V3:V4互动。不需要这些互动仅仅是我面临的问题的本质。)
是否有一种简洁的方法可以在R中获得df.combined
答案 0 :(得分:2)
我不确定这是否符合您对“简洁”的定义。
dfc <- cbind(df1,df2)
dfc2<- cbind( dfc, `V1:V3`=interaction(dfc$V1, dfc$V3, sep=":"),
`V1:V4`=interaction(dfc$V1,dfc$V4, sep=":") )
df.combined <- cbind( dfc2, `V2:V3`=interaction(dfc$V2, dfc$V3, sep=":"),
`V2:V4`=interaction(dfc$V2,dfc$V4, sep=":") )
> df.combined
V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
1 a c e g a:e a:g c:e c:g
2 b d f h b:f b:h d:f d:h
(通常不建议在变量名中使用冒号。然后总是需要引用冒号。
答案 1 :(得分:0)
这是一个解决方案。也许不是非常优雅或简洁,但可能有用......
dat <- data.frame(V1=c("a", "b"),
V2=c("c", "d"),
V3=c("e", "f"),
V4=c("g", "h"))
factor_pairs <- expand.grid(c("V1", "V2"),
c("V3", "V4"),
stringsAsFactors=FALSE)
for (i in 1:nrow(factor_pairs)) {
factor_1 <- factor_pairs[i, 1]
factor_2 <- factor_pairs[i, 2]
new_col_name <- paste(factor_1, factor_2, sep=":")
dat[[new_col_name]] <- paste(dat[[factor_1]], dat[[factor_2]], sep=":")
}
dat
# V1 V2 V3 V4 V1:V3 V2:V3 V1:V4 V2:V4
# 1 a c e g a:e c:e a:g c:g
# 2 b d f h b:f d:f b:h d:h
答案 2 :(得分:0)
如果名称中的冒号不是必需的,则只需要一行代码就可以处理两个数据框的列绑定并创建交互。使用您的两个数据框:
df.combined <- with(c(df1, df2), data.frame(df1, df2, V1:V3, V1:V4, V2:V3, V2:V4))
给出了
V1 V2 V3 V4 V1.V3 V1.V4 V2.V3 V2.V4
1 a c e g a:e a:g c:e c:g
2 b d f h b:f b:h d:f d:h
如果您需要名称中的冒号,则另一个oneliner会将句点更改为冒号:
colnames(df.combined) <- gsub("\\.", ":", colnames(df.combined))
留下最终结果
V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
1 a c e g a:e a:g c:e c:g
2 b d f h b:f b:h d:f d:h