【问题标题】:How to apply specific function to range of columns(but applying it to every column alone) in R?如何将特定函数应用于R中的列范围(但将其单独应用于每一列)?
【发布时间】:2017-05-24 20:41:40
【问题描述】:

我使用的数据看起来如何(它是一个 SNP 数据):

AA CC CA GG  
GA CA CC GG  
GG CCCC CAA GG  
CA GG CC GC 

我希望它在案例 2 之后变成怎样(由于第 2 列有多个字符,第 3 行被删除,所有列都被分成 2)

A A C C C A G G  
G A C A C C G G  
C A G G C C G C

案例 1
我现在用的是什么

mydata <- mydata[which(!nchar(as.character(mydata[,5]))>2),]
mydata <- mydata[which(!nchar(as.character(mydata[,6]))>2),]
mydata <- mydata[which(!nchar(as.character(mydata[,7]))>2),]

我希望它是

mydata <- mydata[which(!nchar(as.character(mydata[,5:7]))>2),]

问题在于该函数正在按 5:7 计算所有列并删除每一行。我想要相同的,但对每一列都这样做,而不是一起做。
案例2 我的代码 这使用库

library(dplyr)
library(splitstackshape)

run for each column 拆分第 6 列的单元格

data2$V6 = as.character(data2$V6)
data2 <- cSplit(data.frame(data2 %>% rowwise() %>%
mutate(V6 = V6, V6n = paste(unlist(strsplit(V6, "")),
collapse = ','))), "V6n", ",")
data2$V5 <- NULL

我对所有列都做同样的事情 问题我想为所有列做 潜在的解决方案: 不同类型的循环,但我无法使其工作。 任何帮助将不胜感激

【问题讨论】:

标签: r dplyr splitstackshape


【解决方案1】:

这是一个完全矢量化的解决方案,以达到您想要的输出

## Convert all the rows into a single vectors
tmp <- do.call(paste0, mydata)

## Remove too long rows, split and rbind
do.call(rbind, strsplit(tmp[nchar(tmp) == 2 * ncol(mydata)], "", fixed = TRUE))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] "A"  "A"  "C"  "C"  "C"  "A"  "G"  "G" 
# [2,] "G"  "A"  "C"  "A"  "C"  "C"  "G"  "G" 
# [3,] "C"  "A"  "G"  "G"  "C"  "C"  "G"  "C" 

这将导致matrix,但如果需要,可以轻松转换为data.frame

【讨论】:

  • 这就是解决方案!
  • 只是一个附加问题。这对我有用,但是如果我有其他列的值较长,例如名称(带有引用名称的附加列),我可以将其保留为矩阵中的行名吗?
  • @A.Stefanov 我不确定您的意思,但您可以在 matrix 中指定行名或将其转换为 data.frame 并添加行名。例如见here
  • 只有一个示例行:“1 snp1 0 5000650 A A A C C C A C C C C C” 但我会尝试找到解决方案 这对我来说并不重要。我只是好奇。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2023-03-17
  • 2020-11-22
  • 2020-02-15
  • 1970-01-01
  • 2018-11-10
  • 2015-12-05
相关资源
最近更新 更多