2016-12-05 58 views
2

我有一個數據框的列表,例如更改數據框列表中的列的類別

df1 = data.frame(ID=c("id1", "id2", "id3"), A1 = c("A", "A", "B"), A2 = c("AA", "AA", "AA")) 
df2 = data.frame(ID=c("id2", "id3", "id4"), A1 = c("B", "B", "B"), A2=c("BB", "BB", "BB")) 
df3 = data.frame(ID=c("id1", "id2", "id3"), A1 = c("A", "A", "A"), A2 = c("AA", "BB", "BB")) 
listDF = list(df1, df2, df3) 

我想知道是否有一個好的方法來改變從因素到字符類。這是我曾嘗試:

d <- lapply(listDF, function(x) sapply(x[,"A1", "A2"], as.character)) 

此代碼給我我想要更改列,但有沒有辦法只是改變了類,而不必再添加這些新列?

回答

1

mutate_at()功能從dplyr包來這裏派上用場:

library(dplyr) 
d <- lapply(listDF, function(df) mutate_at(df, .cols = 2:3, as.character)) 

您也可以通過列名.cols參數:

d <- lapply(listDF, function(df) mutate_at(df, .cols = c("A1", "A2"), as.character)) 

或者通過正則表達式選擇列:

# mutate columns whose names start with A 
d <- lapply(listDF, function(df) mutate_at(df, vars(matches("^A")), as.character)) 

在基礎R,這可能是:

d <- lapply(listDF, function(df) {df[c("A1", "A2")] <- lapply(df[c("A1", "A2")], as.character); df}) 
+0

謝謝Psidom,它的工作原理,但我希望有可能在基礎R溶液中不添加功能... – user971102

+0

它也可以很容易地在基礎R完成。查看更新! – Psidom

+0

啊太棒了!非常感謝!! – user971102

1

我們可以使用data.table

lapply(listDF, function(df) setDT(df)[, (2:3) := lapply(.SD, as.character), .SDcols = 2:3])