R:将列表列表写入带有名称的文本文件
我有一个列表,列表的结构如下:R:将列表列表写入带有名称的文本文件,r,list,write.table,R,List,Write.table,我有一个列表,列表的结构如下: a = list("t" = list('abc'), "c" = list('def','ghi')) b = list("t" = list('jk','kl'), "c" = list('lmn')) c = list("t" = list('op','pq','z'), "c" = list('qrs','tuv','wxy')) ls = list('one'=a,'two'=b,'three'=c) 我需要将其存储在一个文本文件中。由于并非所有元
a = list("t" = list('abc'), "c" = list('def','ghi'))
b = list("t" = list('jk','kl'), "c" = list('lmn'))
c = list("t" = list('op','pq','z'), "c" = list('qrs','tuv','wxy'))
ls = list('one'=a,'two'=b,'three'=c)
我需要将其存储在一个文本文件中。由于并非所有元素的长度都相同,所以在将其转换为数据帧并写入文件之前,我需要填充NAN。我想要一个类似这样的文件(这里大致显示为.csv,但是.txt可以):
我是R的新手,所以我对如何做这件事只有一个大致的认识,无法理解语法。伪代码中的类似内容:
lapply(ls, fill nans)
lapply(ls, unlist)
lapply(ls, names=[t1,t2,t3,c1,c2,c3])
df=data.frame(ls)
write.table(df)
有人能带我走过这段路吗
编辑:我在以下方面取得了一些进展:
ellength <- function(ls,i) {return(length(ls[[i]]))}
fillna <- function(ls,i,m) {
if (length(ls[[i]])<m) {
return(append(ls[[i]],vector('list',length=m-length(ls[[i]]))))
}
else {return(ls[[i]])}
}
make_col <- function(ls,i){
return(lapply(ls,fillna,i=i,m=max(unlist(lapply(ls,ellength,i=i)))))
}
> matrix(list(make_col(ls,'t'),make_col(ls,'c')))
[,1]
[1,] List,3
[2,] List,3
ellength这有帮助吗
library(tidyr)
library(dplyr)
a = list("t" = 'abc', "c" = list('def','ghi'))
b = list("t" = 'jk', "c" = list('lmn'))
c = list("t" = 'op', "c" = list('qrs','tuv','wxy'))
ls = list('one'=a,'two'=b,'three'=c)
#unlist and turn into a df
lx <- as.data.frame( unlist(ls),stringsAsFactors = FALSE)
#make rownames as column
lx$nms <- rownames(lx)
#split nms column so you can transpose your data
lx <- separate(lx, nms, c("v1","v2"), sep = "[.]")
lx <- mutate(lx, v3 = `unlist(ls)`) %>%
select(-`unlist(ls)`)
#transpose your data - it fills with NA
#NaN is a numeric field so you can't use it to fill character variables
lx2 <- spread(lx,v2,v3)
考虑在取消列出嵌套列表后构建数据帧列表:
char_vec <- unlist(ls)
df_list <- lapply(names(ls), function(x) {
tmp <- data.frame(t(char_vec[names(char_vec)[grep(x, names(char_vec))]]),
stringsAsFactors = FALSE)
names(tmp) <- gsub(".*\\.", "", names(tmp))
return(tmp)
})
df_list
# [[1]]
# t c1 c2
# 1 abc def ghi
# [[2]]
# t1 t2 c
# 1 jk kl lmn
# [[3]]
# t1 t2 t3 c1 c2 c3
# 1 op pq z qrs tuv wxy
数据表(带有rbindlist
)
输出
final_df1
# c1 c2 c3 t1 t2 t3
# 1 def ghi <NA> abc <NA> <NA>
# 2 lmn <NA> <NA> jk kl <NA>
# 3 qrs tuv wxy op pq z
identical(final_df1, final_df2)
# [1] TRUE
identical(final_df1, final_df3)
# [1] TRUE
identical(final_df2, final_df3)
# [1] TRUE
final\u df1
#c1 c2 c3 t1 t2 t3
#1 def ghi abc
#吉隆坡南部2号
#3 qrs tuv wxy op pq z
相同(最终设计图1、最终设计图2)
#[1]是的
相同(最终设计图1、最终设计图3)
#[1]是的
相同(最终设计图2、最终设计图3)
#[1]是的
好的,现在我有:>lx2 v1 c c1 c2 c3 t t1 t2 t3 1 def ghi abc 2 3 qrs tuv wxy op pq z 3 2 lmn jk kl如何用c1折叠c,用t1折叠t?你可以用如果用其他方法来折叠c和c1,我将更新我的答案,以显示一个对c有效的示例,但是当我这样做的时候没有起作用:lx2我相信你必须把is.na(c)
改成is.na(t)
像这样:lx2是的,你是对的,我刚刚意识到并准备评论同样的内容
char_vec <- unlist(ls)
df_list <- lapply(names(ls), function(x) {
tmp <- data.frame(t(char_vec[names(char_vec)[grep(x, names(char_vec))]]),
stringsAsFactors = FALSE)
names(tmp) <- gsub(".*\\.", "", names(tmp))
return(tmp)
})
df_list
# [[1]]
# t c1 c2
# 1 abc def ghi
# [[2]]
# t1 t2 c
# 1 jk kl lmn
# [[3]]
# t1 t2 t3 c1 c2 c3
# 1 op pq z qrs tuv wxy
final_df1 <- bind_rows(df_list)
# CLEAN UP AND RE-ORDER COLUMNS
final_df1 <- transform(final_df1,
t1 = ifelse(is.na(t), t1, t),
t = NULL,
c1 = ifelse(is.na(c), c1, c),
c = NULL
)
final_df1 <- final_df1[order(names(final_df1))]
final_df2 <- data.frame(rbindlist(df_list, fill=TRUE))
# CLEAN UP AND RE-ORDER COLUMNS
final_df2 <- transform(final_df2,
t1 = ifelse(is.na(t), t1, t),
t = NULL,
c1 = ifelse(is.na(c), c1, c),
c = NULL
)
final_df2 <- final_df2[order(names(final_df2))]
# RETRIEVE ALL COLUMN NAMES
nms <- names(unlist(df_list))
df_list <- lapply(df_list, function(df){
# CREATE BLANK COLUMNS FOR rbind
for(i in nms) {
if(!i %in% names(df)) {
df[[i]] <- NA
}
}
# CLEAN UP AND RE-ORDER COLUMNS
df <- within(df, {t1 <- ifelse(is.na(t), t1, t)
t <- NULL
c1 <- ifelse(is.na(c), c1, c)
c <- NULL
})
return(df[order(names(df))])
})
final_df3 <- do.call(rbind, df_list)
final_df1
# c1 c2 c3 t1 t2 t3
# 1 def ghi <NA> abc <NA> <NA>
# 2 lmn <NA> <NA> jk kl <NA>
# 3 qrs tuv wxy op pq z
identical(final_df1, final_df2)
# [1] TRUE
identical(final_df1, final_df3)
# [1] TRUE
identical(final_df2, final_df3)
# [1] TRUE