【问题标题】:Change dataframe in sample by sampling unit format to incidence-frequency format (Prep dataframe for iNext incidence dataframe)通过采样单元格式将样本中的数据帧更改为发生频率格式(为 iNext 发生数据帧准备数据帧)
【发布时间】:2017-07-07 23:28:28
【问题描述】:

我有一个这样的数据框:

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 = 2 的 A_B 的发生频率。不计算同一 loc 中重复的 interact 级别。因此,虽然 A_B 在区域 1 中出现了 3 次,但它仅在两个唯一的 loc 中出现。发生频率计算此interact 出现在多少个唯一loc 级别。

2) 新数据框应矢量化所有区域中所有可能的interact 级别,并计算每个区域的这些发生率。因此,对于该区域未发生的所有级别的交互,都应包括 0。

3) 第一行需要是该区域中唯一loc 级别的计数。在区域 1 中有 2 个地方级别(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"))

我不知道从哪里开始,但这是我从@akrun 在Convert from long to wide format counting frequency of eliminated factor level (Prepping dataframe for input into iNEXT Online) 上发布的类似问题中改编的内容,但出现以下错误:

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

【问题讨论】:

  • 到目前为止您尝试过哪些无效的方法?
  • 我已添加到 OP 以解决您的问题。感谢您的宝贵时间。

标签: r inext


【解决方案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 都在“original-R-verse”中。

【讨论】:

  • 感谢您的帮助。但是,您的输出将区域 1 内发生的 A_B 交互相加,总共为 3。我需要计算它存在的 loc 级别数(这将 = 2)。为了添加一些上下文,我需要一个区域内每种交互类型发生的区域的数量,而不是获取一个区域中交互的总丰度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
相关资源
最近更新 更多