[英]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。 在示例中,您有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 感興趣,在第一列名稱前加上垃圾文本,以避免在第一列中獲取 BOM 字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.