r - 如何在 R 中将特定函数应用于列范围(但仅将其应用于每一列)?

标签 r dplyr splitstackshape

我使用的数据看起来如何(它是 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)

对每列运行会拆分第 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

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

最佳答案

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

## 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" 

这将产生一个矩阵,但如果需要,可以轻松转换为data.frame

关于r - 如何在 R 中将特定函数应用于列范围(但仅将其应用于每一列)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41567469/

相关文章:

database - 在关系数据库中存储 R 对象

r - 研究原始和内部R函数的源代码: How is R connected with C?

R函数在同一列中搜索和计算多个条件?

r - 根据列值复制数据框中的行

r - 如何将此 'for' 循环转换为向量解

r - 为每个组添加行

r - 复杂的条件变异 : Create new variable with conditional mutating using only past observations for a given participant?

r - 是否可以在 mutate 中使用过滤器?

r - 将不相关/相似的观察结果合并为一个(其他)