我有下面的 Dataframe ,基于一个条件--文本中出现百万或千--我需要将数字列乘以百万或千,然后放置一个千分隔符:
df <- data.frame(col1=c('', 'assets', 'loss', 'liability'),
col2=c(NA, 5000, -1400, 300),
col3=c(NA, 4500, -1100, 500))
df
col1 col2 col3
<chr> <dbl> <dbl>
NA NA
assets 5000 4500
loss -1400 -1100
liability 300 500
我正在尝试下面的脚本,以查看出现了哪种条件-- million还是thousand --,乘以该条件,然后放置一个千分隔符:
multiply_columns <- function(df){
text <- "in millions, except share and per share data"
# Iterate over the columns
for (idx in 2:length(names(df))) {
# Check if text contains million
if (grepl(text, "in millions", fixed = TRUE)) {
# If yes, multiply column values with million else thousand
df[, idx] <- format(df[, idx]*1000000, big.mark=",", scientific=FALSE)
} else
df[, idx] <- format(df[, idx]*1000, big.mark=",", scientific=FALSE)
}
return(df)
}
看起来这个函数没有正确地相乘。它是乘以1000,而文本包含了数百万。
multiply_columns(df)
col1 col2 col3
<chr> <chr> <chr>
NA NA
assets 5,000,000 4,500,000
loss -1,400,000 -1,100,000
liability 300,000 500,000
所需输出
col1 col2 col3
<chr> <dbl> <dbl>
NA NA
assets 5,000,000,000 4,500,000,000
loss -1,400,000,000 -1,100,000,000
liability 300,000,000 500,000,000
如有任何建议,将不胜感激。谢谢!
2条答案
按热度按时间k97glaaz1#
我更熟悉tidyverse函数,但下面是我将如何构造函数:
有几点:
text
作为函数的参数,我认为您可能希望根据 Dataframe 传入该参数。编辑并补充一点,R在查找您调用的变量时非常灵活,如果您在函数中调用它,尽管没有将其作为参数传入,R也可能在全局环境中查找
text
(对于其他语言来说,这是一种奇怪的行为)但是,如果函数外部的数据是my_df,而要计算的文本是my_text,你可以这样使用我的函数bxfogqkk2#
我们可以将
thousand
、million
取出,替换为1e3
和1e6
进行相乘,假设text
可以输入到函数中