从两个数据帧r生成所有可能的列联表

时间:2017-11-27 21:37:03

标签: r dataframe

今天有一个大脑屁,我希望这是一个我错过的明显修复。我有两个数据帧,一个是端点的数据帧,另一个是风险因素的数据帧。我将计算所有可能的风险因素组合对所有可能结果的所有风险比。我需要一个能从两个数据帧生成所有可能的列联表的函数。如果有一个成名的工作允许我输入一些统计函数作为列联表函数的一部分,那将是很好的。

示例数据:

a = c(1,0,1,1,1)
b = c(0,1,1,0,0)
c = c(1,1,0,0,1)
d = c(0,0,0,1,1)

risk = data.frame(a,b)
endpoint = data.frame(c,d)

同样,如果你可以把它拼成一个循环,这将允许我在创建列联表时计算统计数据,我将不胜感激。它允许我将现有代码复制/粘贴到函数中。

由于

1 个答案:

答案 0 :(得分:1)

并不完全清楚"列联表"您正尝试创建,但以下内容为tablerisk的所有组合提供了endpoint输出:

lapply(data.frame(t(expand.grid(names(risk), names(endpoint), 
                                stringsAsFactors = FALSE)), stringsAsFactors = FALSE), 
       function(x) table(risk[[x[1]]], endpoint[[x[2]]], dnn = x))

请注意,有两个stringsAsFactors=FALSE,一个用于expand.grid,另一个用于data.frame,因为这两个函数都隐式地将字符转换为因子,这对table来说是不可取的。要简化上述代码,您可以使用tidyverse等效代码:

map(as.tibble(t(expand.grid(names(risk), names(endpoint), 
                            stringsAsFactors = FALSE))), 
    ~ table(risk[[.[1]]], endpoint[[.[2]]], dnn = .))

<强>结果:

$X1
   c
a   0 1
  0 0 1
  1 2 2

$X2
   c
b   0 1
  0 1 2
  1 1 1

$X3
   d
a   0 1
  0 1 0
  1 2 2

$X4
   d
b   0 1
  0 1 2
  1 2 0