【问题标题】:Convert 1 column for each dataframe in list为列表中的每个数据框转换 1 列
【发布时间】:2017-06-21 15:48:22
【问题描述】:

之前我需要按行拆分数据帧,现在我有一个包含 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() 可能有办法做到这一点,但我想不通。

【问题讨论】:

标签: r dataframe lapply


【解决方案1】:

对于for(i in ...),每个i 都是一个元素的副本。您只是分配给副本,这不会影响原件。要引用特定对象,最好使用名称或索引。所以让你的代码工作的方法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多