2017-07-07 39 views
1

我有一个数据帧,像这样:变化数据帧由采样单元格式入射频率格式(准备数据帧为iNext发生率数据帧)

df<- data.frame(region = c("1","1","1","1","1","2","3","3","3"), 
       loc = c("104","104","104","105","105","106","107", "108", "109"), 
       interact = c("A_B","A_B", "B_C", "C_D", "A_B", "E_F", "E_F", "F_G", "A_B")) 

我想使一个数据帧的是:

1)对每个region子集计数发生在loc水平之间的给定相互作用的发生频率。因此,在上面的示例中,在区域1中有两个loc(104和105),它们都具有交互A_B。因此,区域1的发生频率为A_B = 2.同一loc中的重复interact水平不计算在内。所以虽然A_B在区域1中出现3次,但它只发生在两个独特的loc中。有多少独特loc水平这个interact时发生频率计数。

2)新的数据框应该向量化所有可能interact各级区域之间,并计算这些发生率的每个区域。因此,0应该包含在该地区没有发生的所有层次的互动中。

3)第一行需要是该地区独特的loc级别的计数。在区域1中有2个loc位点(104,105),区域2 1个位点级别(106)和区域3,3个位点级别(107-109)。

最终输出如下:

output<- data.frame(interact = c("","A_B","B_C","C_D","E_F","F_G"), 
        region1 = c("2","2","1","0","1","0"), 
        region2 = c("1","0","0","0","1","0"), 
        region3 = c("3","1","0","0","1","1")) 

我不知道从哪里开始的这一点,但这里是我在贴在Convert from long to wide format counting frequency of eliminated factor level (Prepping dataframe for input into iNEXT Online)了类似的问题已经适应从@akrun,但得到有错误:

library(tidyverse) 
df %>% 
group_by(region = paste0('region', region)) %>% 
     summarise(interact = "", V1 = n_distinct(loc)) %>% 
     spread(region, V1), 
     df %>% 
     group_by(region = paste0('region', region) & loc), 
       interact = as.character(interact)) %>% 
     summarise(V1 = length(unique((interact)) %>% 
     spread(region, V1, fill = 0)) 
+0

到目前为止您尝试过哪些方法无效? –

+0

我已经添加到OP来解决您的问题。感谢您的时间。 – Danielle

回答

1

随着澄清评论(并重新阅读问题),我正在修改我的建议,但它仍然使用base-R方法。试试这个:

my_table <- with(df, table(interact, loc, region)) 
apply(my_table, c(1,3), function(x){sum(x > 0)}) 
    # 2nd arg to apply (1 & 3) give num of pos "loc"'s by interact and region 

会给你:

 region 
interact 1 2 3 
    A_B 2 0 1 
    B_C 1 0 0 
    C_D 1 0 0 
    E_F 0 1 1 
    F_G 0 0 1 

如果你真的需要重新标记区域层面,这不是特别困难。这是我会怎样进行(假设你分配一个值collapse_tbl

colnames(collapse_tbl) <- 
      paste0 ("region", attr(collapse_tbl, 'dimnames')$region) 
collapse_tbl 
     region 
interact region1 region2 region3 
    A_B  2  0  1 
    B_C  1  0  0 
    C_D  1  0  0 
    E_F  0  1  1 
    F_G  0  0  1 

这是一个矩阵对象,而不是一个数据帧而不像一个R“table'对象,你可以,如果你使用as.data.frame想在这个类。“自然”的方式来处理数据是使用“长”的安排。你仍然可以使用普通的索引与矩阵(或表)对象。

> collapse_tbl["F_G", "region3"] 
[1] 1 

xtabs功能往往是用于此目的tablextabs是在“原始R-verse”。

+0

我感谢你的帮助。然而,你的输出将区域1内发生的A_B相互作用相加得到总数3.我需要计算它存在的loc级别的数目(这将= 2)。要添加一些上下文,而不是获取一个区域中总的交互丰度,我需要每个交互类型发生在一个区域内的图的数量。 – Danielle