【问题标题】:Creating a function with a for loop into lapply在 lapply 中创建一个带有 for 循环的函数
【发布时间】:2021-12-08 05:39:14
【问题描述】:

我正在尝试使用一个简单的函数对列表的每个数据框的列执行操作。 这是数据:

a<-LETTERS[1:6]
b<-1:6

df1<-as.data.frame(cbind(a,b))
df2<-as.data.frame(cbind(a,b))
df3<-as.data.frame(cbind(a,b))

df_list<-list(df1,df2,df3)

这些是我想用来重命名列表中数据框的名称:

df_names<-c("first","second","third")

到目前为止,我已经做到了:

df2_list <- lapply(df_list, function(df_list) { 
  for(i in df_list[[i]]$b) { 
    df_double<-list((as.numeric(df_list[[i]]$b))*(2))
    names(df_double)<-df_names[i]
  } 
  df_list
} )

这给了我这个错误:

 Error in .subset2(x, i, exact = exact) : invalid subscript type 'list' 

但是,如果我尝试分别运行这两个命令,例如在列表的第一个数据帧上,它们会执行我想要的操作:

df_double<-list((as.numeric(df_list[[1]]$b))*(2))
names(df_double)<-df_names[1]

我知道我遗漏了一些东西,但我看不到什么...提前致谢!

【问题讨论】:

    标签: r list lapply


    【解决方案1】:

    使用lapplyb 列乘以2,并使用setNames 分配名称。

    setNames(lapply(df_list, function(x) transform(x, b = b * 2)), df_names)
    
    #$first
    #  a  b
    #1 A  2
    #2 B  4
    #3 C  6
    #4 D  8
    #5 E 10
    #6 F 12
    
    #$second
    #  a  b
    #1 A  2
    #2 B  4
    #3 C  6
    #4 D  8
    #5 E 10
    #6 F 12
    
    #$third
    #  a  b
    #1 A  2
    #2 B  4
    #3 C  6
    #4 D  8
    #5 E 10
    #6 F 12
    

    为清楚起见,您也可以分步执行此操作。

    names(df_list) <- df_names
    lapply(df_list, function(x) transform(x, b = b * 2))
    

    【讨论】:

    • 感谢 Ronak,但现在错误消息是 Error in b * 2 : non-numeric argument to binary operator(我不明白,因为 b 是数字向量)。我尝试了df1&lt;-as.data.frame(cbind(a,as.numeric(b))),但没有成功。
    • 不要使用as.data.frame(cbind(...)),只有data.frame就足够了。 df1&lt;- data.frame(a,b)。对其他数据帧也这样做。
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2020-02-23
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多