为子集因子的每个级别创建重复字符的新数据帧

时间:2017-05-25 20:54:00

标签: r

我在物种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)

3 个答案:

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

regioninteracti

对数据进行排序
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