我检查过上一篇关于如何将lapply输出转换为数据框的帖子,这对我没有帮助
我问过两个问题,我试图提供一份有代表性的数据,但事实并非如此。解决方案适用于示例,但不适用于实际数据。这是我的问题。
how to apply a function on every column of a data?
让我疯狂但我无法解决的问题是
我可以做到这一点,它在数据上完美运行,但我必须做1000次并生成1000个文件....
s1 <- normalize(df[,1], ";")
Mn <- as.data.frame(process(s1))
write.table(Mn, file= "~/Desktop/outputs/output62.txt", quote = FALSE, sep="\t")
rm(Mn,s1)
但是当我使用
时lapply(myS, process)
I get error like:
Error in data.frame(All_Fractions = c(161L, 153L, 218L, 2847L, 2565L, : arguments imply differing number of rows: 7, 5, 10
我别无选择,只能发布我的真实数据,以便能够解决我的问题。
我像这样加载它们
df1 <- read.table("~/Desktop/df1.txt", sep="\t", header=TRUE, stringsAsFactors=FALSE)
df2 <- read.table("~/Desktop/df2.txt", sep="\t", header=TRUE, stringsAsFactors=FALSE)
这是我到目前为止使用的代码
normalize <- function(x, delim) {
x <- gsub(")", "", x, fixed=TRUE)
x <- gsub("(", "", x, fixed=TRUE)
idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "",
as.character(x)))+1)
names <- unlist(strsplit(as.character(x), delim))
return(setNames(idx, names))
}
myS <- lapply(df1, normalize,";")
lookup <- normalize(df2[,1], ",")
process <- function(s) {
lookup_try <- lookup[names(s)]
found <- which(!is.na(lookup_try))
pos <- lookup_try[names(s)[found]]
return(paste(pos, sep=""))
}
输出我试过这个
Mn <- as.data.frame(lapply(myS, process),FUN=as.data.frame)
给我错误
data.frame出错(Fraction_1 = c(393L,674L,79L,2447L,248L), Fraction_2 = c(2107L,:参数意味着不同的行数: 5,30,51,35
我试过
Mn <- as.data.frame(lapply(myS, process))
data.frame出错(Fraction_1 = c(393L,674L,79L,2447L,248L), Fraction_2 = c(2107L,:参数意味着不同的行数: 5,30,51,35
给我错误
Mn <- lapply(myS, process)
我无法保存输出
write.table(Mn, file= "~/Desktop/outputs/output.txt", quote = FALSE, sep="\t")
data.frame出错(Fraction_1 = c(393L,674L,79L,2447L,248L), Fraction_2 = c(2107L,:参数意味着不同的行数: 5,30,51,35
答案 0 :(得分:1)
如果列表中的所有列都具有相同的长度,则只能将list
变为data.frame
。事实并非如此。
如果这只是保存和恢复列表,请尝试执行此操作的save
和load
命令。否则,您可以尝试将元素附加到各个列(&#34;&#34;或NA),以使它们具有相同的长度。
在下面的代码中,我用空格填充所有列以使它们具有相同的长度,然后您可以毫无问题地将其写出来。
df1 <- read.csv("df1.txt",sep="\t",stringsAsFactors=F)
df2 <- read.csv("df1.txt",sep="\t",stringsAsFactors=F)
normalize <- function(x, delim) {
x <- gsub(")", "", x, fixed=TRUE)
x <- gsub("(", "", x, fixed=TRUE)
idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "",
as.character(x)))+1)
names <- unlist(strsplit(as.character(x), delim))
return(setNames(idx, names))
}
myS <- lapply(df1, normalize,";")
lookup <- normalize(df2[,1], ",")
process <- function(s) {
lookup_try <- lookup[names(s)]
found <- which(!is.na(lookup_try))
pos <- lookup_try[names(s)[found]]
return(paste(pos, sep=""))
}
Mn <- lapply(myS, process)
# ------------ Start of the answer
# Pad the vectors with spaces to make them the same length
mxlen <- max(sapply(Mn, length))
Mnn <- lapply(Mn, function(x)(c(x, rep(" ", mxlen - length(x)))))
# Write it out
write.table(Mnn, file = "output.txt", quote = FALSE, sep = "\t")