簡體   English   中英

R 在數據幀列表中應用 function

[英]R lapply function across a list of data frames

這個問題在論壇上有類似的解決方案; 但是我無法讓代碼正常工作,需要提出一個新問題。

我有大約 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 中的列。 同樣,我似乎沒有正確的 function 可以正常工作。 我要修改以循環遍歷所有數據幀的具體代碼是:

names(df1)[names(df1) 
          %in% Qs$Original.Question] = Qs$Question[match(names(df1)[names(df1) 
          %in% Qs$Original.Question], Qs$Original.Question)]

這允許我使用 CSV 重命名所有問題列,因為在將數據框合並到單個數據框之前必須重命名它們。 同樣,我似乎無法正確應用 lapply function。

我很抱歉需要再次提出類似的問題。 我曾嘗試修改代碼,但慘遭失敗。

您首先需要過濾掉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

您可以根據其名稱中的模式獲得 dataframe。 在示例中,您有df1df2 ,您可以使用'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 感興趣,在第一列名稱前加上垃圾文本,以避免在第一列中獲取 BOM 字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM