在数据帧列表上使用Rapply函数。

问题描述 投票:0回答:1

在论坛上有类似的解决方案,但是我无法让代码工作,需要提出一个新的问题。

我有大约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函数。

我很抱歉需要再次提出类似的问题。我曾试着改编代码,但都失败了。

r dataframe lapply gsub
1个回答
2
投票

你首先需要过滤掉 NULL 对象。你可以这样做。

dflist <- Filter(Negate(is.null), dflist)
lapply(dflist, function(x) setNames(x,gsub("[^A-Za-z0-9]", "", names(x))))
[[1]]
   sex  school daysmissed
1    M   north          5
2    F   north          1
3    M central          2
4    M   south          0
5    F   south          7
6    F   south          1
7    F central          3
8    M   north          2
9    M   north          4
10   F   south         15

[[2]]
  ID Q1 Q11
1  1  2   3

[[3]]
  ID Q1a Q11
1  2   3   4

[[4]]
  OriginalQuestion Question
1              Q1a      Q.1

1
投票

你可以根据他们名字中的模式来获取数据框架。就像在例子中,你有 df1, df2你可以使用以下模式获得列表中的所有数据框。'df' 后面跟着一个数字。使用 mget 以获得它们在一个列表中。lapply 并重新命名列。

list_df <- mget(ls(pattern = 'df\\d+'))
dflist <- lapply(list_df, function(x) 
                 {names(x) <- gsub("[^A-Za-z0-9]", "", names(x));x})

此外,您可能会对以下内容感兴趣 R的read.csv在第1列名称前加上垃圾文本。 这就避免了在第一列中得到BOM字符。

© www.soinside.com 2019 - 2024. All rights reserved.