如何将特定函数应用于 R 中的列范围(但仅将其应用于每一列)?
How to apply specific function to range of columns(but applying it to every column alone) in R?
我使用的数据看起来如何(它是 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"
这将导致 matrix
,但如果需要可以轻松转换为 data.frame
我使用的数据看起来如何(它是 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"
这将导致 matrix
,但如果需要可以轻松转换为 data.frame