将列表中的所有数据帧合并到r中的单个数据帧

use*_*605 0 r list dataframe

这个是一个doozy.我一直试图弄清楚这一点,但我一直在撞墙.所以,我是以科学的名义来寻找这个.

简介

我在目录中有大约93个具有唯一名称的文件.我使用r将这些文件读入列表.

files.measurements <- as.character(list.files(path = "~/measurements/", full.names = TRUE))

所以,这样做只是找到目录中所有文件的名称.所有这些文件都是.csv.给我带来了很多麻烦.

然后我读了文件的名称. measurements.filenames <- gsub(".csv", "", basename(files.measurements))

读取这些文件的原因是因为每个文件名都代表测量的名称.文件中的相同项目可能存在也可能不存在于多个文件中.

有5个文件名,即,NameA,NameB,NameC,NameD,NameE.每个文件有8个列名:id,name,sex,dob,...,measurement.(每个文件名的名称相同)

当然,id是唯一的,但NameB如果存在,则可能存在也可能不存在int NameA.

需要 所以,我需要做的就是这些93个文件合并到一个单一的数据帧,使得数据帧中包含id,name,sex,dob和,......而不是measurement文件名- NameA,例如.对于相同的id,值应该相同,如果id不存在,则rbind对于具有附加列的数据帧,否则如果id存在,则只需measurement使用新列名称添加到列中NameB.

你能帮忙吗?这是为了研究收集心血管和HIV疾病的数据.

编辑 数据 NameA

id  gender  dob status  date    measurement
1   F   5/24/1942   Rpt 1/12/2018   2.9
2   F   12/1/2017   Rpt 1/12/2018   0.622
3   M   11/15/1957  Rpt 1/11/2018   3.6
4   M   5/17/1947   Rpt 1/11/2018   3.5
5   F   7/17/1955   Rpt 1/11/2018   2.7
Run Code Online (Sandbox Code Playgroud)

NameB

id  gender  dob status  date    measurement
1   F   5/24/1942   Rpt 1/12/2018   3.5
2   F   12/1/2017   Rpt 1/12/2018   2.5
8   M   11/15/1957  Rpt 1/11/2018   1.9
10  M   5/17/1947   Rpt 1/11/2018   0.8
11  F   7/17/1955   Rpt 1/11/2018   1.2
Run Code Online (Sandbox Code Playgroud)

说明

因此,如您所见,两个表中的所有列都相同,但最后一次测量是不同的.请忽略gender,dob,statusdate现在列.让我们专注于idmeasurement.正如你所看到的,id 12都在表NameANameB.如果是这种情况,NameB则应将测量值添加到measurementfrom NameBwith name(如NameB-measurement)旁边的数据帧中.并且对于NameANameB should be added as new row with测量中不存在的所有id,fromNameA as blank butNameB-measurement`添加.

我知道这很复杂,但这就是研究人员给我的数据.我需要以某种方式清理它.

Ind*_*til 7

请尝试以下方法:

# collecting all the csv files in a given folder
files.measurments <- base::list.files(path = ".", include.dirs = FALSE)

# reading all csv files into a list of dataframes
files.combined <- purrr::map(files.measurements, read.csv)

# combining the individual dataframes into a single dataframe
finaldf <- plyr::rbindfill(files.combined)
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!欢迎光临本站!更现代的版本是`dplyr :: bind_rows()`而不是`plyr :: rbindfill`. (3认同)
  • SO的良好开端. (2认同)