Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 找到重复项的所有索引并将其写入新列中_R_Duplicates - Fatal编程技术网

R 找到重复项的所有索引并将其写入新列中

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

我有一个data.frame,它只有一列,一个字符串向量

这些字符串具有重复的值。 我想找到这个向量中有重复项的字符串,并将它们的位置索引写在一个新列中

例如,我认为:

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 )