为不同的DataFrame更改同一列的值(在R中)

时间:2016-04-07 19:00:25

标签: r variables for-loop

我有以下情况:

我有17个不同的DataFrame,它们都有相同的列( COD_MOEDA ) 我有一个Vector( NAME_DATAFRAME ),其中包含DataFrames的17个变量名称

我试图在所有数据帧中循环以应用条件:对于所有DATAFRAMES上的COD_MOEDA列上的所有值== 0,将其更改为“BRL”

我尝试在变量( ConditionString )上连接条件,但我无法使用ConditionString< - “BRL”来应用规则:

for (i in 1:17)
{

ConditionString <-paste(NAME_DATAFRAME[i],"&COD_MOEDA[",NAME_DATAFRAME[i],"&COD_MOEDA==0”],sep=””)

(??)

}

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您尝试按名称操作对象(作为字符串),getassign函数是您的朋友。这是一个按名称遍历每个data.frame的解决方案。

for (df in NAME_DATAFRAME) {

    # Get the current dataframe by name
    y <- get(df, pos = globalenv())

    # Do stuff
    y$COD_MOEDA[y$COD_MOEDA == 0] <- 'BRL'

    # Assign the new dataframe back to its name
    assign(df, y, pos = globalenv())

    # Tidy up
    rm(y)
}
rm(df)

然而,这不是一个非常类似于R&#34;因为R在循环中不是特别有效。正如@josliber指出的那样,如果将数据帧存储在列表中并使用apply函数按顺序对每个数据进行操作,那么您将获得更好的性能(和可读性)。

您可以通过更改上游代码将数据帧放入列表中,但这是从当前状态到达目的地的简单方法:

list_of_dataframes <- sapply(
    NAME_DATAFRAME,
    get,
    pos = globalenv(),
    simplify = FALSE
)

从这里开始,您可以使用lapply函数来操作每个数据帧。

list_of_modified_dataframes <- lapply(
    list_of_dataframes,
    function(x) {
        # Inside this function, `x` represents a single dataframe

        # Do stuff
        x$COD_MOEDA[x$COD_MOEDA == 0] <- 'BRL'

        # And return the modified dataframe
        return(x)
    }
)

我不确定你的最终目标是什么,但要注意分配字符串&#39; BRL&#39;隐式地将列从数字转换为字符。这意味着后续的数字条件语句(例如COD_MOEDA> 42)将不起作用。