r - 重命名列表中每个数据框中的列,而列数不同
问题描述
我希望创建一个简短的 if-else(或其他如果这是一种愚蠢的方法)函数来重命名列表中所有数据帧的列。我确实看到了许多类似的问题,这些问题帮助我完成了我的代码,但它们在某些细节上存在偏差,给我留下了一个悬而未决的问题。我真的希望在没有包的情况下做到这一点(看起来很愚蠢,因为 tidyverse 已经加载了......)
图书馆 - 应该是不必要的。
library(raster)
library(tidyverse)
library(sf)
library(data.table)
示例数据:
player <- list(`10` = structure(list(ID = "10", integer_val = 1028, coords.x1 = 266781.960994547,
coords.x2 = 4208220.00292058, X1979_08 = 18.1568756103516,
X1979_09 = 21.3082904815674, X1979_10 = 14.6396112442017,
X1979_11 = 5.12351417541504, X1979_12 = 6.30002880096436,
X1980_01 = 4.20031881332397, X1980_02 = 5.70116329193115,
X1980_03 = 5.33258485794067, X1980_04 = 8.69955348968506,
X1980_05 = 9.88166332244873, X1980_06 = 22.8935871124268,
X1980_07 = 24.7441787719727), row.names = 1L, class = "data.frame"),
`10015` = structure(list(ID = "10015", integer_val = 811,
coords.x1 = 432912.236471687, coords.x2 = 4418957.6628215,
X1961_09 = 9.60138702392578, X1961_10 = 9.8080587387085,
X1961_11 = 3.80465173721313, X1961_12 = 2.24590229988098,
X1962_01 = 2.89834785461426, X1962_02 = 4.26397132873535,
X1962_03 = 4.47179555892944, X1962_04 = 8.64332294464111,
X1962_05 = 11.5554437637329, X1962_06 = 15.2697010040283), row.names = 891L, class = "data.frame"))
现在我已经为每个列表创建了名称(通常每个列表有 6k-7k 婴儿数据帧)
column_names <- c('ID', 'integer_val', 'longitude', 'latitude', '12', '11', '10', '09', '08', '07', '06', '05', '04', '03', '02', '01')
colnames_vpd <- c(column_names[1:4], paste("vpd", column_names[5:16], sep = "-"))
有些人可能会争辩说这种方法是不必要的,但是重命名发生在一些需要一晚才能运行的函数输出的列表上,所以我只是尝试点击运行并进入睡眠......
Names_func <- function(x, y){
if(ncol(x) == 16)
{colnames(x) <- y}
else{colnames(x) <- y[1:(ncol(x)-1)]
}
}
test <- lapply(X = listabc, FUN = Names_func, y = colnames_vpd)
所以我的函数的问题在于它不仅覆盖了列名,而且覆盖了每个数据帧中的所有数据。我对此尝试了很多排列,但无济于事。然后将这些数据转换为 dt 并使用 rbindlist 和填充。
我知道使用 dplyr 的重命名可以即时完成非常相似的结果,但如果可能的话,我更喜欢基本解决方案。谢谢。
编辑:我非常确信我比石头还笨。抱歉,如果您已阅读此处。
Names_func <- function(x, y){
if(ncol(x) == 16)
{names(x) <- y}
else{names(x) <- y[1:(ncol(x))]
}
return(x)
}
解决方案
Names_func <- function(x, y){
if(ncol(x) == 16)
{names(x) <- y}
else{names(x) <- y[1:(ncol(x))]
}
return(x)
}
我忘了在函数中分配一个返回值。这就是解决方案。
推荐阅读
- google-cloud-platform - 如何检查 GCP 中的导出操作是否完成?
- vim - How to exec Vim
command in function when insert mode? - sql - SQL MERGE - 当不匹配时使用选择表插入
- r - 如何在 R 中将日期从 mm/dd/YYYY 转换为 dd/mm/YYYY?
- javascript - 无法使用 ipfs.add() 将图像上传到 ipfs
- c# - .NET CORE 3.1 ApiController 装饰器是否使用 System.Text.Json 返回 json?
- javascript - 如何从不同的 HTML 文件调用 JavaScript 函数?
- python - 正则表达式返回两个数字?
- android - 我无法在 Android Studio 中运行模拟器
- regex - 如何在JMeter的while控制器中保存特定采样器的响应主体