R 为什么lapply不提供与数据帧兼容的输出?

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

我查看了上一篇关于如何将Lappy输出转换为数据帧的文章,这对我没有帮助

我问了两个问题,我试图给出一个有代表性的数据,但事实并非如此。该解决方案适用于示例,但不适用于实际数据。这是我的问题

让我发疯但我无法解决的问题是

我可以做到这一点,它的数据工作完美,但我必须这样做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)
为了能够解决我的问题,我别无选择,只能发布我的真实数据

我是这样装的

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