2017-02-13 71 views
0

我想实现某种循环从数据帧制表所有变量对一个常量,常量是另一个变量。创建使用对所有其他变量不变一个变量数据帧多发的表

例如,假设我有3个变量一个数据帧,如下面的伪数据,我想给出产生的表。

df <- data.frame(V1 = factor(c("L", "L", "XL", "M", "S", "XXL")), 
       V2 = factor(c("Tall", "Medium", "Tall", "Small", "Small", "Very Tall")), 
       V3 = factor(c("Vegan", "Vegetarian", "Non-V", "Vegan", "Non-V", "Non-V"))) 

attach(df) 

table(V3, V3) 
table(V3, V2) 
table(V3, V1) 

我的目标是创建每个单独的表并将它们编译成列表。一旦列入清单,我可以使用匿名功能的组合和应用家庭电话进行兴趣计算。但是,我需要找到一种方法来创建具有多个变量的大型数据集的这些表,而无需手动创建每个表的繁琐工作。

我试过使用lapply,sapplyfor循环,但似乎无法得到一种适用于我的方法。有没有办法做到这一点,跨越所有变量创建表并将它们放入列表中?

+1

我误解你的问题,我想,但使用'lapply'提供了一个额外的答案。 – lmo

+0

该方法工作得很好,正是我一直在寻找的。我对桌子后发生的事情有点不清楚吗?我知道我们正在将表函数应用到df的子集,而没有我想要比较的常量。 df [,1]实现了什么? – Seanosapien

+1

'df [,1]'是'table'的第二个参数,如'table(df [,2],df [,1])''。 – lmo

回答

1

要在data.frame一个变量比较所有其它的变量,然后返回一个列表,你可以使用lapply这样。

lapply(df[-1], table, df[,1]) 
$V2 

      L M S XL XXL 
    Medium 1 0 0 0 0 
    Small  0 1 1 0 0 
    Tall  1 0 0 1 0 
    Very Tall 0 0 0 0 1 

$V3 

      L M S XL XXL 
    Non-V  0 0 1 1 1 
    Vegan  1 1 0 0 0 
    Vegetarian 1 0 0 0 0 

df[-1]说,除了第一个在DF所有变量。注意这是返回一个矢量,而不是一个单一的元素列表用于table需要df[,1]逗号。


如果你想建立非同一变量对(V1-V2,V1,V3,V2,V3)的表的列表,你可以使用combn。 simplify = FALSE参数返回一个列表。

combn(df, 2, FUN=table, simplify=FALSE) 
[[1]] 
    V2 
V1 Medium Small Tall Very Tall 
    L  1  0 1   0 
    M  0  1 0   0 
    S  0  1 0   0 
    XL  0  0 1   0 
    XXL  0  0 0   1 

[[2]] 
    V3 
V1 Non-V Vegan Vegetarian 
    L  0  1   1 
    M  0  1   0 
    S  1  0   0 
    XL  1  0   0 
    XXL  1  0   0 

[[3]] 
      V3 
V2   Non-V Vegan Vegetarian 
    Medium  0  0   1 
    Small   1  1   0 
    Tall   1  1   0 
    Very Tall  1  0   0 

如果你也想通过自身得到每个变量的表,然后

lapply(1:2, function(i) combn(df, i, FUN=table, simplify=FALSE)) 

会产生表格的嵌套列表。

+0

这是一个很好的功能,谢谢。 x数量的表生成后可以终止它吗?例如,如果我希望在处理所有V1(行)组合后停止。我只想要其中V1是行的表。干杯! – Seanosapien

+0

对于'combn',最简单的方法是计算所有的表格,然后对列表进行子集划分。对于上面的例子,你可以做combn(df,2,FUN = table,simplify = FALSE)[1:2]。 – lmo

+0

好的。再次感谢。 – Seanosapien

相关问题