我有一个像这样的数据框:
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)计算每个loc
子集在region
级别之间发生的给定交互的发生频率。因此,在上面的示例中,在区域1中,有两个loc
(104和105)都具有交互A_B
。因此,区域1的A_B
的发生频率= 2.不计算同一interact
中的重复loc
级别。因此,虽然A_B在区域1中出现3次,但它仅出现在两个唯一的loc
中。发生率频率计算此loc
出现的唯一interact
级别。
2)新数据帧应该对所有区域中所有可能的interact
级别进行矢量化,并计算每个区域的这些级别的发生率。因此,对于在该区域中没有发生的所有交互级别,应该包括0。
3)第一行需要是该地区唯一loc
级别的计数。在区域1中,有2个区域水平(104,105),区域21个区域水平(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 :(得分: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'-object不同,如果你想在那个类中使用它,你可以使用as.data.frame
。处理数据的“自然”方式是使用“长”排列。您仍然可以使用矩阵(或表)对象的常用索引。
> collapse_tbl["F_G", "region3"]
[1] 1
xtabs
函数通常用于此目的。 table
和xtabs
都在“原始R-verse”中。