我在物种i和j(例如A_B)之间的共享交互的数据帧(df)中称为" interaction"。从相应的图和交互采样的区域记录相互作用。我想找到一个地区内地块之间的所有共享互动。因此,对于每个区域子集,输出应返回区域内的图之间发生的重复交互。数据如下:
df<-
region plot interact
1 104 A_B
1 105 B_C
1 106 A_B
1 107 C_D
2 108 B_C
2 109 B_C
2 110 E_F
2 111 B_C
3 112 A_B
3 113 A_B
我希望输出是一个数据框,只显示区域内的图之间的共享交互。将删除每个区域的唯一交互。因此,上述示例的输出显示为:
output
region interact
1 A_B
2 B_C
3 A_B
我尝试过for循环
region<-NA
shared.interact<- NA
for (i in 1:length(unique(df$region)) {
region[i] <- unique(df$region)
shared.interact[i]<- duplicated(df$interact)
}
data.frame(region, shared.interaction)
答案 0 :(得分:1)
这是一个使用split-apply-combine方法的基本R方法。
do.call(rbind, lapply(split(df[c("region", "interact")], df$region),
function(x) unique(x[duplicated(x$interact),])))
region interact
1 1 A_B
2 2 B_C
3 3 A_B
在区域上拆分子集data.frame,然后应用一个函数,该函数返回一个data.frame,其中包含对这些区域的eac重复的唯一观察集。最后,rbind
这些与do.call
一起。
在data.table
中,这将是
library(data.table)
setDT(df)[, unique(interact[duplicated(interact)]), by=region]
region V1
1: 1 A_B
2: 2 B_C
3: 3 A_B
数据强>
df <-
structure(list(region = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L,
3L), plot = 104:113, interact = structure(c(1L, 2L, 1L, 3L, 2L,
2L, 4L, 2L, 1L, 1L), .Label = c("A_B", "B_C", "C_D", "E_F"), class = "factor")), .Names = c("region",
"plot", "interact"), class = "data.frame", row.names = c(NA,
-10L))
答案 1 :(得分:0)
使用imagesc(I)
即可:
dyplr
您按library(dplyr)
df %>%
group_by(region) %>%
count(interact) %>%
filter(n > 1)
#> # A tibble: 3 x 3
#> # Groups: region [3]
#> region interact n
#> <int> <chr> <int>
#> 1 1 A_B 2
#> 2 2 B_C 3
#> 3 3 A_B 2
分组,计算region
中值的出现频率,并保留出现多次的值。您可以通过在管道末尾添加interact
来删除新列。
答案 2 :(得分:0)
library(data.table)
df<-read.table(header=TRUE,text={"
region plot interacti
1 104 A_B
1 105 B_C
1 106 A_B
1 107 C_D
2 108 B_C
2 109 B_C
2 110 E_F
2 111 B_C
3 112 A_B
3 113 A_B"})
dt <- data.table(dt)
按region
和interacti
setkey(dt,region,interacti)
仅使用必需的列。搜索重复项,最后搜索unique
。
unique(dt[,.(region,interacti)][duplicated(region)&duplicated(interacti),])
# region interacti
# 1: 1 A_B
# 2: 2 B_C
# 3: 3 A_B