我有以下情况:
我有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=””)
(??)
}
有什么建议吗?
答案 0 :(得分:1)
在这种情况下,您尝试按名称操作对象(作为字符串),get
和assign
函数是您的朋友。这是一个按名称遍历每个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)将不起作用。