为列表中的每个数据帧转换1列

时间:2017-06-21 15:48:22

标签: r dataframe lapply

我需要先按行拆分数据帧,现在我有一个包含65个数据帧的庞大列表。

df_list = split(df, list(df$group))
new_col_name = c("A", "B","group")
df_list = lapply(df_list, setNames, nm=new_col_name)
df_list = lapply(df_list, function(x) x[-1,])

我想将A列(在列表中的所有数据帧中)转换为因子而不是数字。

>head(df_list)

$`0`
        A          B    count
.3375E+03  .5295E+00        0
.3380E+03  .4412E+00        0
.3385E+03  .0123E+00        0

$`1`
       A           B    count
.3370E+03  .4939E+00        1
.3375E+03  .5295E+00        1
.3380E+03  .5679E+00        1

$`2
       A           B    count
.3370E+03  .4934E+00        2
.3375E+03  .5286E+00        2
.3380E+03  .5673E+00        2

这是一些可重现的数据(为了简单起见,我将第一个变量转换为一个因子)。

test = data.frame(A = c(".3375E+03", ".3380E+03", ".3385E+03"),
B = c(.5295E+00 , .4412E+00, .0123E+00),
C = c(0,0,0))

我尝试了以下内容:

for (i in df_list){ 
  i$A = as.numeric(as.character(i$A))
}

但不知何故,这实际上并未分配给df_list:

> str(df_list[[1]])
'data.frame':   549 obs. of  3 variables:
 $ A       : Factor w/ 551 levels ".3370E+03",".3375E+03",..: 2 3 4 5 6 7 8 9 10 11 ...

使用apply()sapply()可能有办法实现,但我无法理解。

1 个答案:

答案 0 :(得分:1)

使用for(i in ...),每个i都是元素的副本。您只需分配副本,但不会影响原始副本。要引用特定对象,最好使用名称或索引。因此,让代码正常工作的方法是:

for (i in seq_along(df_list)) { 
  df_list[[i]]$A = as.numeric(as.character(df_list[[i]]$A))
}