【问题标题】:How to repeat performing a function in R multiple times如何在R中重复执行一个功能多次
【发布时间】:2011-06-13 19:33:44
【问题描述】:

我有一个看起来像这样的数据框

DF:

V1  V2          V3  V4  V5  V6  V7  V8      
0   ss66369915  0   0   G   A   A   A
0   ss66112992  0   0   A   A   A   A
0   ss66369329  0   0   A   A   A   A
0   ss66368644  0   0   A   A   A   A
0   ss66368284  0   0   A   A   G   A
0   ss66126380  0   0   A   G   A   G
0   ss66407282  0   0   A   A   A   A
0   ss66405035  0   0   A   A   A   A
0   ss66405148  0   0   G   G   A   G
0   ss66405271  0   0   G   G   G   G

V6 到 V9 列中的数据是双等位基因型,所以我想将每两列合并为一列。

例如,它看起来像:

V1  V2          V3  V4 V5_V6 V7 V8     
0   ss66369915  0   0   GA  A   A
0   ss66112992  0   0   AA  A   A
0   ss66369329  0   0   AA  A   A
0   ss66368644  0   0   AA  A   A
0   ss66368284  0   0   AA  G   A
0   ss66126380  0   0   AG  A   G
0   ss66407282  0   0   AA  A   A
0   ss66405035  0   0   AA  A   A
0   ss66405148  0   0   GG  A   G
0   ss66405271  0   0   GG  G   G

我能够做到这一点:

DF$V5_V6=paste(DF$V5, DF$V6, sep="")

or

within(DF, V5_V6 <- paste(V5, V6, sep=''))

但是我的实际数据框由 4776 行组成,我必须从第 5 列到第 4776 列每两列合并一次。

我想知道如何在不手动操作的情况下实现这一目标。我尝试使用 for 循环但没有成功。我对使用 R 很陌生。

谢谢!

【问题讨论】:

    标签: r merge iteration


    【解决方案1】:

    也许您可以显示您尝试过的 for 循环?

    这是一种使用循环的方法,如果我理解你想要的,应该做你想要的。具体来说 - 这个 for 循环会将第 5 和 6、7 和 8、9 和 10 等列的值粘贴在一起。我们使用names() 函数提取相关的列名并将它们粘贴在一起。我们使用[ 来索引创建的对象newdat

    #read in data
    txt <- "V1  V2          V3  V4  V5  V6  V7  V8      
    0   ss66369915  0   0   G   A   A   A
    0   ss66112992  0   0   A   A   A   A
    0   ss66369329  0   0   A   A   A   A
    0   ss66368644  0   0   A   A   A   A
    0   ss66368284  0   0   A   A   G   A
    0   ss66126380  0   0   A   G   A   G
    0   ss66407282  0   0   A   A   A   A
    0   ss66405035  0   0   A   A   A   A
    0   ss66405148  0   0   G   G   A   G
    0   ss66405271  0   0   G   G   G   G"
    
    dat <- read.table(textConnection(txt), header = TRUE)
    
    #Create a new object so as to not interfere with the original
    newdat <- dat[, 1:4]
    
    for (colInd in seq(5, (ncol(dat) - 1), by = 2)) {
      colNames <- paste(names(dat)[colInd], names(dat)[colInd + 1], sep = "_")
      newdat[, colNames] <- paste(dat[, colInd], dat[, colInd + 1], sep = "")
    }
    

    结果:

    > newdat
       V1         V2 V3 V4 V5_V6 V7_V8
    1   0 ss66369915  0  0    GA    AA
    2   0 ss66112992  0  0    AA    AA
    3   0 ss66369329  0  0    AA    AA
    4   0 ss66368644  0  0    AA    AA
    5   0 ss66368284  0  0    AA    GA
    6   0 ss66126380  0  0    AG    AG
    7   0 ss66407282  0  0    AA    AA
    8   0 ss66405035  0  0    AA    AA
    9   0 ss66405148  0  0    GG    AG
    10  0 ss66405271  0  0    GG    GG
    

    【讨论】:

    • 这看起来很棒!谢谢你解释得这么好!这正是我想要的。我马上试试,然后回复你!
    • 效果很好!!太感谢了!我正在尝试的循环与您所做的差不多,但我绝对没有您说的那么优雅。
    【解决方案2】:

    你也可以这样做:

    library(stringr)
    newdat$V5V6 <-  apply(dat[,5:6], 1,  str_c, collapse="")
    newdat$V7V8 <-  apply(dat[,7:8], 1,  str_c, collapse="")
    

    【讨论】:

    • 如果您有 100 列要创建,您将如何概括这一点?我认为这就是 for 循环类型结构会派上用场的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多