仅在r中查找组成员

仅在r中查找组成员,r,R,我一直在为个人定义组成员。我曾经在excel中工作,但由于一个组中的个人数量在不同组中有所不同,所以这项工作失败了。我用了这个公式 =IFERROR(INDEX($A$1:$A$10727;SMALL(IF($S$1:$S$10727=$S2;ROW($S$1:$S$10727);"");Nth);1);"NA") 这将返回组中的第n个个体。这是不起作用的,因为我给了所有的个人,我只想要小组成员,所以不是个人本身。所以我想去R,但我不知道从哪里开始 我的数据如下所示: group ID 1

我一直在为个人定义组成员。我曾经在excel中工作,但由于一个组中的个人数量在不同组中有所不同,所以这项工作失败了。我用了这个公式

=IFERROR(INDEX($A$1:$A$10727;SMALL(IF($S$1:$S$10727=$S2;ROW($S$1:$S$10727);"");Nth);1);"NA")
这将返回组中的第n个个体。这是不起作用的,因为我给了所有的个人,我只想要小组成员,所以不是个人本身。所以我想去R,但我不知道从哪里开始

我的数据如下所示:

group ID 
1     1
1     2
1     3
2     4
2     5
3     6
3     7
3     8
3     9
3     10
group ID gm1 gm2 gm3 gm4
1     1   2   3   NA  NA
1     2   1   3   NA  NA
1     3   1   2   NA  NA
2     4   5   NA  NA  NA  
2     5   4   NA  NA  NA  
3     6   7   8   9   10
3     7   6   8   9   10
3     8   6   7   9   10
3     9   6   7   8   10
3     10  6   7   8   9
我想这样:

group ID 
1     1
1     2
1     3
2     4
2     5
3     6
3     7
3     8
3     9
3     10
group ID gm1 gm2 gm3 gm4
1     1   2   3   NA  NA
1     2   1   3   NA  NA
1     3   1   2   NA  NA
2     4   5   NA  NA  NA  
2     5   4   NA  NA  NA  
3     6   7   8   9   10
3     7   6   8   9   10
3     8   6   7   9   10
3     9   6   7   8   10
3     10  6   7   8   9

R中是否有一个公式可以为我提供组成员?

我们可以使用
combn
cSplit

library(splitstackshape)
df1$gm <- unlist(unsplit(lapply(split(df1$ID, df1$group), function(x)
       lapply(x, function(y) {
           i1 <- x[y!= x]
         if(length(i1) >1) combn(i1, length(i1), FUN = paste, collapse=", ") else i1
          })), df1$group))
cSplit(df1, 'gm', ', ')
#    group ID gm_1 gm_2 gm_3 gm_4
# 1:     1  1    2    3   NA   NA
# 2:     1  2    1    3   NA   NA
# 3:     1  3    1    2   NA   NA
# 4:     2  4    5   NA   NA   NA
# 5:     2  5    4   NA   NA   NA
# 6:     3  6    7    8    9   10
# 7:     3  7    6    8    9   10
# 8:     3  8    6    7    9   10
# 9:     3  9    6    7    8   10
#10:     3 10    6    7    8    9
library(data.table)
cSplit(setDT(df1)[,  gm := unlist(lapply(seq_len(.N), function(i) {
             i1 <- ID[i != seq_len(.N)]
          if(length(i1) > 1) combn(i1, length(i1), FUN =paste, collapse=", ") 
        else as.character(i1)})), group], 'gm', ', ')
数据
df1我们可以使用
combn
cSplit

library(splitstackshape)
df1$gm <- unlist(unsplit(lapply(split(df1$ID, df1$group), function(x)
       lapply(x, function(y) {
           i1 <- x[y!= x]
         if(length(i1) >1) combn(i1, length(i1), FUN = paste, collapse=", ") else i1
          })), df1$group))
cSplit(df1, 'gm', ', ')
#    group ID gm_1 gm_2 gm_3 gm_4
# 1:     1  1    2    3   NA   NA
# 2:     1  2    1    3   NA   NA
# 3:     1  3    1    2   NA   NA
# 4:     2  4    5   NA   NA   NA
# 5:     2  5    4   NA   NA   NA
# 6:     3  6    7    8    9   10
# 7:     3  7    6    8    9   10
# 8:     3  8    6    7    9   10
# 9:     3  9    6    7    8   10
#10:     3 10    6    7    8    9
library(data.table)
cSplit(setDT(df1)[,  gm := unlist(lapply(seq_len(.N), function(i) {
             i1 <- ID[i != seq_len(.N)]
          if(length(i1) > 1) combn(i1, length(i1), FUN =paste, collapse=", ") 
        else as.character(i1)})), group], 'gm', ', ')
数据
df1使用
dplyr
tidyr
可以通过以下方式解决此问题。首先,我们定义一个函数来解决单个组的问题,然后使用
do
将此函数应用于所有组

library(dplyr)
df <- data.frame(group = rep(1:3, c(3, 2, 5)), ID = 1:10)

add_group_members <- function(df) {
   df_copy <- df 
   colnames(df_copy)[2] <- "gm_id"
   inner_join(df, df_copy, by = c("group" = "group")) %>% 
   filter(ID != gm_id) %>% 
   group_by(ID) %>% 
   mutate(gm = paste("gm", row_number(), sep = '')) %>% 
   tidyr::spread(key = gm, value = gm_id) %>% ungroup
}

df %>% group_by(group) %>% do(add_group_members(.)) %>% ungroup
库(dplyr)
df%
tidyr::排列(键=gm,值=gm\U id)%>%解组
}
df%%>%group\U by(group)%%>%do(添加组成员(.))%%>%ungroup

使用
dplyr
tidyr
可以通过以下方式解决此问题。首先,我们定义一个函数来解决单个组的问题,然后使用
do
将此函数应用于所有组

library(dplyr)
df <- data.frame(group = rep(1:3, c(3, 2, 5)), ID = 1:10)

add_group_members <- function(df) {
   df_copy <- df 
   colnames(df_copy)[2] <- "gm_id"
   inner_join(df, df_copy, by = c("group" = "group")) %>% 
   filter(ID != gm_id) %>% 
   group_by(ID) %>% 
   mutate(gm = paste("gm", row_number(), sep = '')) %>% 
   tidyr::spread(key = gm, value = gm_id) %>% ungroup
}

df %>% group_by(group) %>% do(add_group_members(.)) %>% ungroup
库(dplyr)
df%
tidyr::排列(键=gm,值=gm\U id)%>%解组
}
df%%>%group\U by(group)%%>%do(添加组成员(.))%%>%ungroup

另一种
tidyverse
解决方案:

df <- data.frame(x = rep(1:3, c(3, 2, 5)), id = 1:10)

library(tidyverse)
df2 <-
  df %>%
  group_by(x) %>%
  mutate(unique = paste(unique(id), collapse = ","))

df2$group_unique <- map_chr(seq_len(nrow(df2)), function(index) {
  row_unique <- as.numeric(strsplit(df2[[index, "unique"]], ",")[[1]])
  paste0(setdiff(row_unique, df2[[index, "id"]]), collapse = ",")
})

df2 %>%
  select(-unique) %>%
  separate(group_unique, paste("gm_", 1:(max(table(df$x)) - 1)))
df%
mutate(unique=paste(unique(id),collapse=“,”)
df2$group_unique%
单独(组唯一,粘贴(“gm”,1:(最大值(表(df$x))-1)))

另一种
tidyverse
解决方案:

df <- data.frame(x = rep(1:3, c(3, 2, 5)), id = 1:10)

library(tidyverse)
df2 <-
  df %>%
  group_by(x) %>%
  mutate(unique = paste(unique(id), collapse = ","))

df2$group_unique <- map_chr(seq_len(nrow(df2)), function(index) {
  row_unique <- as.numeric(strsplit(df2[[index, "unique"]], ",")[[1]])
  paste0(setdiff(row_unique, df2[[index, "id"]]), collapse = ",")
})

df2 %>%
  select(-unique) %>%
  separate(group_unique, paste("gm_", 1:(max(table(df$x)) - 1)))
df%
mutate(unique=paste(unique(id),collapse=“,”)
df2$group_unique%
单独(组唯一,粘贴(“gm”,1:(最大值(表(df$x))-1)))


你的问题不清楚,为什么我们有gm4,而你发布的数据中没有第4组。gm代表组成员。第3组有5个人在组中,所以每个人有4个组成员您的问题不清楚,为什么我们有gm4,而您发布的数据中没有第4组。gm代表组成员。第3组在组中有5个人,因此每个人有4个组成员。这还没有做到。它返回个体本身,但我需要组members@Lisette这两种方法都提供了您在帖子中显示的预期输出。如果我引用你的话
我想这样:
我错过了编辑:)但是,我在[中的第一个
中得到了错误,第二个:
错误在[.data.table(setDT(df),:=(gm,unlist(lapply)(seq_len(.N),:RHS('character')的类型必须匹配LHS('integer'))。对于最快的情况,检查和强制将对性能产生太大的影响。要么更改目标列的类型,要么强制RHS:=yourself
似乎与数据帧本身有关?能否共享您创建数据帧的方式?@Lisette这是基于您显示的数据集。它正在为meThis工作,但它还没有这样做。它返回个体本身,但我需要组members@Lisette这两种方法都给出了您在帖子中显示的预期输出。如果我引用您的话
,我希望这样:
我错过了编辑:)但是,我在[data.table(setDT(df),:=(gm,unlist(lapply)中得到了第一个
错误(seq_len(.N):RHS(“字符”)的类型必须与LHS(“整数”)匹配。在最快的情况下,检查和强制将对性能产生太大的影响。要么更改目标列的类型,要么强制RHS:=yourself
似乎与数据帧本身有关?您可以分享您创建数据帧的方式吗?@Lisette这是基于您显示的数据集。它对meYep有效,您可以,就是这样我在第一行中提到:)仍然需要一些帮助:(当我尝试使用我的原始数据集(大约10000个个体)时,我得到了错误;
错误:找不到对象“组”
。它指的是内部连接。数据集之间没有区别,除了观察的数量和值的长度(都是9位数)我猜你的列在真实数据中不是命名组…用实际的列名称替换它是的,你是这样做的,这就是我在第一行中提到的:)仍然需要一些帮助:(当我尝试使用我的原始数据集时(大约10.000个人,我得到了错误;
错误:未找到对象“组”
。它指的是内部连接。数据集之间没有差异,除了观察的数量和值的长度(均为9位数字)我猜您的列在实际数据中不是命名组…用实际列名称替换它在小数据集上工作,但我的数据集很大,这导致以下错误:
error in 1:(max(table(df$x))-1):结果太长矢量
在小数据集上工作,但我的数据集很大,这导致以下错误:
1中的错误:(max(table(df$x))-1):结果太长矢量