【发布时间】:2020-09-11 15:01:05
【问题描述】:
这个问题在论坛上有类似的解决方案;但是我无法让代码正常工作,需要提出一个新问题。
我有大约 20 个非常宽的 csv 文件导入到全局环境中。我需要能够删除特殊字符并更改从 CSV 中提取的列的名称。
这是两个数据帧的示例代码,然后生成一个列表:
df1 <- data.frame("ï.ID" = 1, "Q.1" = 2, Q1.1 = 3)
df2 <- data.frame("ï.ID." = 2, "Q.1a" = 3, Q1.1 = 4)
Qs <- data.frame("Original.Question" = "Q1a", "Question" = "Q.1")
dflist <- lapply(ls(), function(x) if (class(get(x)) == "data.frame") get(x))
当我导入文件时,在 ID 列前面有一个 BOM 字符 i,上面有两个点。我在单个数据帧中使用以下代码,因为我尝试在 dflist 上使用 lappy 都失败了。
names(df1) <- gsub("[^A-Za-z0-9]", "", names(df1))
我想做的第二件事是重命名 csv 中的列。同样,我似乎没有正确的功能来工作。我要修改以循环遍历所有数据帧的具体代码是:
names(df1)[names(df1)
%in% Qs$Original.Question] = Qs$Question[match(names(df1)[names(df1)
%in% Qs$Original.Question], Qs$Original.Question)]
这允许我使用 CSV 重命名所有问题列,因为在将数据框合并到单个数据框之前必须重命名它们。同样,我似乎无法正确应用 lapply 功能。
对于需要再次提出类似问题,我深表歉意。我尝试过修改代码,但失败得很惨。
【问题讨论】:
-
特别是当框架具有非常相似的结构和/或意图时,最好将它们存储在最初的
list中,而不是将它们存储在单独的框架中。将它们分开的唯一时间是仅将函数应用于其中一个(有选择地)是常态,而将函数应用于所有它们是极端例外。