R 为什么lapply不提供与数据帧兼容的输出?
我查看了上一篇关于如何将Lappy输出转换为数据帧的文章,这对我没有帮助 我问了两个问题,我试图给出一个有代表性的数据,但事实并非如此。该解决方案适用于示例,但不适用于实际数据。这是我的问题 让我发疯但我无法解决的问题是 我可以做到这一点,它的数据工作完美,但我必须这样做1000次,并生成1000个文件R 为什么lapply不提供与数据帧兼容的输出?,r,list,dataframe,R,List,Dataframe,我查看了上一篇关于如何将Lappy输出转换为数据帧的文章,这对我没有帮助 我问了两个问题,我试图给出一个有代表性的数据,但事实并非如此。该解决方案适用于示例,但不适用于实际数据。这是我的问题 让我发疯但我无法解决的问题是 我可以做到这一点,它的数据工作完美,但我必须这样做1000次,并生成1000个文件 s1 <- normalize(df[,1], ";") Mn <- as.data.frame(process(s1)) write.table(Mn, file= "~/Des
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)
为了能够解决我的问题,我别无选择,只能发布我的真实数据
我是这样装的
df1 <- read.table("~/Desktop/df1.txt", sep="\t", header=TRUE, stringsAsFactors=FALSE)
df2 <- read.table("~/Desktop/df2.txt", sep="\t", header=TRUE, stringsAsFactors=FALSE)
数据帧错误(分数_1=c(393L,674L,79L,2447L,248L),
分数_2=c(2107L):参数表示不同的行数:
5,30,51,35
如果列表中的所有列都具有相同的长度,则只能将
列表
制作成data.frame
。这里显然不是这种情况
如果这只是关于保存和还原列表,请尝试执行save
和load
命令。否则,您可以尝试将元素附加到各个列(“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")
df1我看到你在这方面做了很多工作,这很好。但是如果你也复制了你在那里遇到的错误(而不是“给我错误”)。这也会帮助其他有类似问题的人,因为搜索引擎可以找到这篇文章。你试过类似的do.call(“rbind”,你的列表)吗
-如果列表中的元素具有相同的第一维度长度(即,行的长度相同),那么这应该是可行的。@Stephen Henderson where?老实说,我尝试了很多东西,甚至都不记得了:-((你能告诉我我应该在哪里使用它吗?@Mike Wise谢谢Mike,是的,它让我发疯了,我没有睡觉,但它不起作用!我按照你说的修改了。你是如何在中阅读df1
和df2
的?使用read.csv
?这应该在这个问题中,但我看不到。我喜欢你的答案,可以吗请为Pad添加一些解释?它到底是做什么的?我想了解它我们希望每个列表元素(将成为data.frame列)都有mxlen
元素(长度为mxlen
长度)。因此我们使用lappy
对每个列表元素应用一个函数。该函数连接列表元素(x),使用由rep
构建的新向量,该向量由多个空格组成。该数字为mxlen长度(x)
,mike很抱歉问了这么多愚蠢的问题,你知道如何订购数据帧吗?如果你还没有读过本书的前两章,我就使用df,-我强烈建议你现在就这样做。这会节省很多时间和痛苦。R不像其他语言,这本书解释了如何订购数据帧以及为什么订购数据帧。链接是在线版本,但你可以购买副本也是。df
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)
Mn <- as.data.frame(lapply(myS, process))
Mn <- lapply(myS, process)
write.table(Mn, file= "~/Desktop/outputs/output.txt", quote = FALSE, sep="\t")
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")