r - 在R中组合一堆数据文件
问题描述
样本
fileABC=data.frame("id" = c(1:10),
"var1" = c("5*",8,1,4,"3*",5,6,7,"7*",1),
"var2" = c(7,4,6,"1*","8*",2,0,7,"0*",1))
fileQWE=data.frame("id" = c(1:10),
"var1" = c(7,"5*",8,1,4,"3*",5,"7*",6,2),
"var2" = c("8*",2,0,7,7,4,6,"1*","0*",1))
var1=c(fileABC$var1,fileQWE$var1)
var2=c(fileABC$var2,fileQWE$var2)
WANT = data.frame("id"=c(1:10,1:10)
"var1"=var1,
"var2"=var2,
"source"=c(rep("fileABC",10), rep("fileQWE",10)))
我有 fileABC 和 fileQWE。首先,这些文件包含我想要消除的随机 *。其次,我想在 R 中读取这两个文件并将它们保存为 fileABC 和 fileQWE。然后我想创建数据框 WANT,它将两个文件中的 var1 和两个文件中的 var2 结合起来,并根据它的来源创建等于 fileABC 或 fileQWE 的新变量“源”。我包括了我的尝试,但是您可以运行并看到它不起作用。
解决方案
我们可以使用bind_rows
并获取提取的数字元素parse_number
library(tidyverse)
bind_rows(lst(fileABC, fileQWE), .id = 'source') %>%
mutate_at(vars(starts_with("var")),
list(~ readr::parse_number(as.character(.))))
或使用base R
lst1 <- mget(ls(pattern = "^file"))
out <- do.call(rbind, Map(cbind, lst1, source = names(lst1)))
row.names(out) <- NULL
out[2:3] <- lapply(out[2:3], function(x) as.numeric(sub("*", "", x, fixed = TRUE)))
如果我们想直接从.csv
文件中读取(假设文件在工作目录中)
files <- list.files(pattern = ".csv")
names(files) <- str_remove(files, "\\.csv")
library(readr)
imap_dfr(files, ~ read.csv(.x) %>%
mutate_at(vars(starts_with("var")),
list(~ readr::parse_number(.))) %>%
mutate(source = .y))
推荐阅读
- javascript - 当您单击最后一个具有按钮的子元素时,您可以使用模式打开吗
- javascript - React - forceUpdate 中的回调有什么作用?
- javascript - API 请求问题
- javascript - Javascript在数组中推送元素,如追尾
- javascript - 当浏览器休眠时,ngidle 计时器恢复
- .net - 在不强制 GC 收集的情况下拍摄 .NET 快照
- sql - 检查哪个表在多个表的列中具有所需值
- api - 属于经过身份验证的用户的嵌套资源的 REST 路径命名约定是什么?
- angular - 模拟赛普拉斯中方法的返回值
- python - Python 类在一台机器上没有属性“__new__”,但在另一台机器上没有