首页 > 解决方案 > 从一个数据框列表中设置 colnames 以匹配另一个数据框列表

问题描述

我有两个要组合的数据框列表,但是,它们的列名略有不同,因此我无法对它们进行 rbind。

我希望第二个列表与第一个列表的名称匹配,并且我正在尝试更新第二个列表的名称,以便我可以 rbind。最终产品将用于演示目的。

我的两个数据框列表的一小部分

l1 <- list(Fe = structure(list(Determination_No = 1:6, `2` = c(55.94, 
55.7, 56.59, 56.5, 55.98, 55.93), `3` = c(56.83, 56.54, 56.18, 
56.5, 56.51, 56.34), `4` = c(56.39, 56.43, 56.53, 56.31, 56.47, 
56.35), `5` = c(56.32, 56.29, 56.31, 56.32, 56.39, 56.32), `7` = c(56.48, 
56.4, 56.54, 56.43, 56.73, 56.62), `8` = c(56.382, 56.258, 56.442, 
56.258, 56.532, 56.264), `10` = c(56.3, 56.5, 56.2, 56.5, 56.7, 
56.5), `12` = c(56.11, 56.46, 56.1, 56.35, 56.36, 56.37), Overall = c("", 
"", "", "", "", "")), class = "data.frame", row.names = c(NA, 
-6L)), SiO2 = structure(list(Determination_No = 1:6, `2` = c(7.63, 
7.65, 7.73, 7.67, 7.67, 7.67), `3` = c(7.84, 7.69, 7.59, 7.77, 
7.74, 7.64), `4` = c(7.67, 7.74, 7.62, 7.81, 7.66, 7.8), `5` = c(7.91, 
7.84, 7.96, 7.87, 7.84, 7.92), `7` = c(7.77, 7.83, 7.76, 7.78, 
7.65, 7.74), `8` = c(7.936, 7.685, 7.863, 7.838, 7.828, 7.767
), `10` = c(7.872684992, 7.851291827, 7.872684992, 7.722932832, 
7.680146501, 7.615967003), `12` = c(7.64, 7.71, 7.71, 7.65, 7.82, 
7.68), Overall = c("", "", "", "", "", "")), class = "data.frame", row.names = c(NA, 
-6L)), Al2O3 = structure(list(Determination_No = 1:6, `2` = c(2.01, 
2.02, 2.03, 2.01, 2.02, 2), `3` = c(2.01, 2.01, 2, 2.02, 2.02, 
2.03), `4` = c(2, 2.03, 1.99, 2.01, 2.01, 2.01), `5` = c(2.02, 
2.02, 2.05, 2.03, 2.02, 2.03), `7` = c(1.88, 1.9, 1.89, 1.88, 
1.88, 1.87), `8` = c(2.053, 2.044, 2.041, 2.038, 2.008, 2.02), 
    `10` = c(2.002830415, 2.021725042, 2.021725042, 1.983935789, 
    2.002830415, 2.021725042), `12` = c(2.09, 2.05, 1.96, 2.09, 
    2.06, 2.02), Overall = c("", "", "", "", "", "")), class = "data.frame", row.names = c(NA, 
-6L)))

l2 <- list(Fe = structure(list(V1 = c("Count", "Min", "Max", "Median", 
"Mean", "Std Dev", "Coeff. Variation", "Dev. From Cert Mean", 
"95% Confidence Interval"), `2` = c("0", "   NA", "   NA", "   NA", 
"  NaN", "   NA", "  NA", "  NaN", ""), `3` = c("6", "56.18", 
"56.83", "56.50", "56.48", "0.218", "0.39", " 0.13", ""), `4` = c("6", 
"56.31", "56.53", "56.41", "56.41", "0.080", "0.14", " 0.01", 
""), `5` = c("6", "56.29", "56.39", "56.32", "56.33", "0.034", 
"0.06", "-0.15", ""), `7` = c("6", "56.40", "56.73", "56.51", 
"56.53", "0.125", "0.22", " 0.22", ""), `8` = c("6", "56.26", 
"56.53", "56.32", "56.36", "0.116", "0.20", "-0.09", ""), `10` = c("6", 
"56.20", "56.70", "56.50", "56.45", "0.176", "0.31", " 0.08", 
""), `12` = c("6", "56.10", "56.46", "56.36", "56.29", "0.150", 
"0.27", "-0.21", ""), V10 = c("42", "56.10", "56.83", "56.41", 
"56.41", "0.153", "0.27", "", "0.08")), class = "data.frame", row.names = c("LabsampSum", 
"LabMinSummary", "LabMaxSummary", "LabMedianSummary", "LabMeanSummary", 
"lab.SDSummary", "cv.summmary", "LabDevMean.Summary", "analyte.CI.Summary"
)), SiO2 = structure(list(V1 = c("Count", "Min", "Max", "Median", 
"Mean", "Std Dev", "Coeff. Variation", "Dev. From Cert Mean", 
"95% Confidence Interval"), `2` = c("6", "7.63", "7.73", "7.67", 
"7.67", "0.033", "0.44", "-1.09", ""), `3` = c("6", "7.59", "7.84", 
"7.72", "7.71", "0.091", "1.18", "-0.55", ""), `4` = c("6", "7.62", 
"7.81", "7.70", "7.72", "0.079", "1.02", "-0.48", ""), `5` = c("6", 
"7.84", "7.96", "7.89", "7.89", "0.048", "0.61", " 1.75", ""), 
    `7` = c("6", "7.65", "7.83", "7.76", "7.76", "0.060", "0.77", 
    " 0.01", ""), `8` = c("6", "7.68", "7.94", "7.83", "7.82", 
    "0.086", "1.10", " 0.84", ""), `10` = c("6", "7.62", "7.87", 
    "7.79", "7.77", "0.111", "1.43", " 0.19", ""), `12` = c("6", 
    "7.64", "7.82", "7.70", "7.70", "0.065", "0.84", "-0.68", 
    ""), V10 = c("48", "7.59", "7.96", "7.74", "7.76", "0.097", 
    "1.25", "", "0.06")), class = "data.frame", row.names = c("LabsampSum", 
"LabMinSummary", "LabMaxSummary", "LabMedianSummary", "LabMeanSummary", 
"lab.SDSummary", "cv.summmary", "LabDevMean.Summary", "analyte.CI.Summary"
)), Al2O3 = structure(list(V1 = c("Count", "Min", "Max", "Median", 
"Mean", "Std Dev", "Coeff. Variation", "Dev. From Cert Mean", 
"95% Confidence Interval"), `2` = c("6", "2.00", "2.03", "2.01", 
"2.01", "0.010", "0.52", "-0.16", ""), `3` = c("6", "2.00", "2.03", 
"2.01", "2.01", "0.010", "0.52", "-0.16", ""), `4` = c("6", "1.99", 
"2.03", "2.01", "2.01", "0.013", "0.66", "-0.49", ""), `5` = c("6", 
"2.02", "2.05", "2.02", "2.03", "0.012", "0.58", " 0.50", ""), 
    `7` = c("0", "  NA", "  NA", "  NA", " NaN", "   NA", "  NA", 
    "  NaN", ""), `8` = c("6", "2.01", "2.05", "2.04", "2.03", 
    "0.017", "0.82", " 0.78", ""), `10` = c("6", "1.98", "2.02", 
    "2.01", "2.01", "0.015", "0.77", "-0.45", ""), `12` = c("0", 
    "  NA", "  NA", "  NA", " NaN", "   NA", "  NA", "  NaN", 
    ""), V10 = c("36", "1.98", "2.05", "2.01", "2.02", "0.016", 
    "0.77", "", "0.01")), class = "data.frame", row.names = c("LabsampSum", 
"LabMinSummary", "LabMaxSummary", "LabMedianSummary", "LabMeanSummary", 
"lab.SDSummary", "cv.summmary", "LabDevMean.Summary", "analyte.CI.Summary"
)))

我努力了

l3 <- lapply(l2, setnames(l2,colnames(l1)))

我收到以下错误消息 Error in setnames(l2, colnames(l1)) : x is not a data.table or data.frame

这对我来说没有意义,因为我将两个列表都设置为具有以下代码的数据框

l2 <- lapply(l2, as.data.frame)

发生此错误我缺少什么?或者我可以强迫 l2 使用 l1 的名字吗?

谢谢

标签: rlistdataframelapply

解决方案


您可以Map在从中提取列名后使用l1

l2 <- Map(setNames, l2, lapply(l1, colnames))

rbind l1然后,您可以l2

Map(rbind, l1, l2)

推荐阅读