R 找到重复项的所有索引并将其写入新列中
我有一个data.frame,它只有一列,一个字符串向量 这些字符串具有重复的值。 我想找到这个向量中有重复项的字符串,并将它们的位置索引写在一个新列中 例如,我认为:R 找到重复项的所有索引并将其写入新列中,r,duplicates,R,Duplicates,我有一个data.frame,它只有一列,一个字符串向量 这些字符串具有重复的值。 我想找到这个向量中有重复项的字符串,并将它们的位置索引写在一个新列中 例如,我认为: DT<- data.frame(string=A,B,C,D,E,F,A,C,F,Z,A) 该字符串比本例中的长很多,我不知道需要的最大列数 最有效的方法是什么? 我知道存在复制函数,但我不确定如何将其组合到我想要得到的结果中 非常感谢 这里有一种方法。我相信下面有一个数据表 DT<- data.frame(str
DT<- data.frame(string=A,B,C,D,E,F,A,C,F,Z,A)
该字符串比本例中的长很多,我不知道需要的最大列数
最有效的方法是什么?
我知道存在复制函数,但我不确定如何将其组合到我想要得到的结果中
非常感谢 这里有一种方法。我相信下面有一个数据表
DT<- data.frame(string=c("A","B","C","D","E","F","A","C","F","Z","A"))
# find matches
rbf <- sapply(DT$string, FUN = function(x, DT) which(DT %in% x), DT = DT$string)
# fill in NAs to have a pretty matrix
out <- sapply(rbf, FUN = function(x, mx) c(x, rep(NA, length.out = mx - length(x))), max(sapply(rbf, length)))
# bind it to the original data
cbind(DT, t(out))
string 1 2 3
1 A 1 7 11
2 B 2 NA NA
3 C 3 8 NA
4 D 4 NA NA
5 E 5 NA NA
6 F 6 9 NA
7 A 1 7 11
8 C 3 8 NA
9 F 6 9 NA
10 Z 10 NA NA
11 A 1 7 11
DT这里有一个带有data.table的选项。按“字符串”分组后,获取序列(seq_len(.N)
)和行索引(.I
),然后将dcast
转换为“宽”格式,并在
上连接原始数据集
library(data.table)
dcast(setDT(DT)[, .(seq_len(.N),.I), string],string ~ paste0("match", V1))[DT, on = "string"]
# string match1 match2 match3
# 1: A 1 7 11
# 2: B 2 NA NA
# 3: C 3 8 NA
# 4: D 4 NA NA
# 5: E 5 NA NA
# 6: F 6 9 NA
# 7: A 1 7 11
# 8: C 3 8 NA
# 9: F 6 9 NA
#10: Z 10 NA NA
#11: A 1 7 11
或者另一个选项是使用“string”拆分
行序列,将列表
元素填充为NA
长度较小的元素,并与原始数据集合并(使用基本R
方法)
lst下面是一个使用tidyverse
工具的工具(不是一行程序;):
谢谢大家!!所有答案都很好,完全解决了我的问题。我认为这是公认的一个,因为它是最短的一个,列的命名也包括在内。
library(data.table)
dcast(setDT(DT)[, .(seq_len(.N),.I), string],string ~ paste0("match", V1))[DT, on = "string"]
# string match1 match2 match3
# 1: A 1 7 11
# 2: B 2 NA NA
# 3: C 3 8 NA
# 4: D 4 NA NA
# 5: E 5 NA NA
# 6: F 6 9 NA
# 7: A 1 7 11
# 8: C 3 8 NA
# 9: F 6 9 NA
#10: Z 10 NA NA
#11: A 1 7 11
lst <- split(seq_len(nrow(DT)), DT$string)
merge(DT, do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))),
by.x = "string", by.y = "row.names")
DT<- data.frame(string=c("A","B","C","D","E","F","A","C",
"F","Z","A"), stringsAsFactors=FALSE)
library( tidyverse )
DT %>% group_by( string ) %>%
do( idx = which(DT$string == unique(.$string)) ) %>%
ungroup %>% unnest %>% group_by( string ) %>%
mutate( m = stringr::str_c( "match", 1:n() ) ) %>%
spread( m, idx )