仅在r中查找组成员
我一直在为个人定义组成员。我曾经在excel中工作,但由于一个组中的个人数量在不同组中有所不同,所以这项工作失败了。我用了这个公式仅在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
=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):结果太长矢量