如何在R中生成具有一列成对的列

时间:2014-10-14 10:17:54

标签: r

V1 ------> FA MA GA RA TA

我希望输出如下

column1 - > FA FA FA FA MA MA MA GA GA

column2 - > MA GA RA TA GA RA TA TA TA

3 个答案:

答案 0 :(得分:0)

您可以使用combn函数执行此操作,该函数会生成所有组合。例如,我们希望将a,b,c组合为两个元素:

 v <- c("a", "b", "c")
 combn(v, 2)

会产生组合矩阵:

     [,1] [,2] [,3]
[1,] "a"  "a"  "b" 
[2,] "b"  "c"  "c" 

如果您希望此矩阵作为对的向量,则可以在列上应用paste并将其折叠为“。” - 一个点:

apply(combn(v, 2), 2, function(x) paste(x, collapse = "."))

这将为您提供字符组合向量 - "a.b" "a.c" "b.c"

答案 1 :(得分:0)

length的行/元素的unique组合生成的V1将大于nrow的{​​{1}}。因此,我不确定您希望如何在同一数据集上生成新列dat。也许您可以使用单个列创建另一个数据框

V2

如果您需要将第一个值与所有其他值粘贴

 dat2 <- data.frame(V2=combn(unique(dat$V1),2, FUN=paste, collapse="."), stringsAsFactors=FALSE)

 dat2$V2
 #[1] "FA.MA" "FA.GA" "FA.RA" "FA.TA" "MA.GA" "MA.RA" "MA.TA" "GA.RA" "GA.TA"
 #[10] "RA.TA"

更新

如果您需要 paste(dat$V1[1], dat$V1[-1], sep=".") #[1] "FA.MA" "FA.GA" "FA.RA" "FA.TA" ,那么(如@aosmith所述)您可以这样做:

paste

数据

  dat2 <- as.data.frame(t(combn(unique(dat$V1),2)))
  dat2
  #   V1 V2
  #1  FA MA
  #2  FA GA
  #3  FA RA
  #4  FA TA
  #5  MA GA
  #6  MA RA
  #7  MA TA
  #8  GA RA
  #9  GA TA
  #10 RA TA

答案 2 :(得分:0)

尝试:

> for(i in 1:(length(V1)-1))
         V2[i] = paste(V1[1], V1[i+1],sep='.')
> V2
[1] "FA.MA" "FA.GA" "FA.RA" "FA.TA"