lapply为什么不给我数据帧兼容输出?

时间:2016-02-27 12:54:44

标签: r list dataframe

我检查过上一篇关于如何将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

1 个答案:

答案 0 :(得分:1)

如果列表中的所有列都具有相同的长度,则只能将list变为data.frame。事实并非如此。

如果这只是保存和恢复列表,请尝试执行此操作的saveload命令。否则,您可以尝试将元素附加到各个列(&#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")