【问题标题】:input variable stored in list into loop in R存储在列表中的输入变量进入R中的循环
【发布时间】:2020-05-24 21:59:19
【问题描述】:

我确信有更好的方法可以做到这一点,我愿意接受建议。

我有这些向量:

vkt1 <- c("df1", "df2", "df3")
vector2 <- paste("sample", wSheatx, sep="_")

第一个向量包含存储在环境中的数据帧名称列表。这些存储为字符串,但我想将它们称为变量名。 第二个向量只是第一个在开头添加“样本”的向量,相当于:

vector2 <- c('sample_df1', 'sample_df2', 'sample_df3')

来自vector2 的这些字符串将用作要创建的新数据框的名称。

好的,所以现在我想做这样的事情:

for (i in 1:length(vector){    # meaning for i in 1,2,3
    vector2[i] = data.frame(which(eval(parse(text = vkt1[i])) == "Some_String", arr.ind=TRUE))
    addStyle(wb, vkt1[i], cols = 1:ncol(eval(parse(text = vkt1[i]))), rows = vector2[[i]][,1]+1, style = duppedStyle, gridExpand = TRUE)
}

它可能看起来很复杂,但想法是创建一个数据帧,命名为包含在vector2 中的字符串,当找到“Some_String”时,它是来自vkt1 的数据帧的子集。 然后,使用该创建的数据框并在存在所述字符串时为整行添加样式。

vector2[[i]][,1]+1 旨在部署为sample_df1[,1]+1(在第一次迭代中)

请注意,我使用eval(parse(text = vkt1[i]))vkt1 的字符串中获取变量。所以,比如说,eval(parse(text = vkt1[1])) 等于 df1(数据帧,而不是字符串)

这样,代码给出如下错误:

In file(filename, "r") :
 cannot open file 'noCoinColor_Concat': No such file or directory

一直试图让它像这样工作,但我开始觉得这种方法可能非常错误。

【问题讨论】:

    标签: r dataframe for-loop


    【解决方案1】:

    将代码和数据保存在列表中而不是单独的数据帧中会更容易管理。

    您可以使用mget 在字符串中获取vkt1 中的所有数据框,假设您想在每个数据框的第一列中搜索'Some_String',您可以这样做:

    new_data <- lapply(mget(vkt1), function(df) df[df[[1]] == 'Some_String', ])
    

    我没有在此处包含addStyle 代码,因为我不知道它来自哪个包以及它的作用,但您可以轻松地将它包含在lapply 的匿名函数中。

    【讨论】:

    • 谢谢,这很有魅力!是的,addStyle 函数来自openxlsx 包。一个小问题,df[df[[1]] == "string", ] 括号内的部分怎么用逗号分隔,是因为它是按行搜索吗?
    • 不,那是因为我们正在对行进行子集化。逗号左侧的任何内容都用于子集行,而逗号右侧的任何内容都用于子集列。
    【解决方案2】:

    将你的数据框组合成一个列表,然后使用applymap家族函数来调整你的数据框不是更容易吗?

    data(mtcars)
    df1 <- mtcars %>% filter(cyl == 4)
    df2 <- mtcars %>% filter(cyl == 6)
    df3 <- mtcars %>% filter(cyl == 8)
    
    df_old_names <- c("df1", "df2", "df3")
    df_new_names <- c("df_cyl_4", "df_cyl_6", "df_cyl_8")
    
    df_list <- lapply(df_old_names, get)
    names(df_list) <- df_new_names
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多