Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';在应用函数中是否使用grepl?_R_Lapply_Grepl - Fatal编程技术网

Can';在应用函数中是否使用grepl?

Can';在应用函数中是否使用grepl?,r,lapply,grepl,R,Lapply,Grepl,我有一个数据框,其值如下: BrandName Expense Apple $1.8B Google $3.2B GE - facebook $281M McDonald $719M 我希望清理这些费用值,使其最终达到相同的规模(以十亿计)。对于ex,最终数据帧应如下所示: BrandName Expense Apple 1.8 Google 3.2 facebook 0.281 McDonald 0.719 $gsub

我有一个数据框,其值如下:

BrandName  Expense
Apple      $1.8B
Google     $3.2B
GE         -
facebook   $281M
McDonald   $719M
我希望清理这些费用值,使其最终达到相同的规模(以十亿计)。对于ex,最终数据帧应如下所示:

BrandName  Expense
Apple      1.8
Google     3.2
facebook   0.281
McDonald   0.719
$gsub可以简单地删除。这很好。但后来我面临着这个问题。 我正在应用一个函数a,它使用grepl检查值是否包含“M”,如果为真(去除“M”,转换为数值,然后除以1000) 如果返回false(带“B”,则转换为数值)


A我们可以使用
gsubfn
来实现这一点。我们用
sub
删除
$
,然后用
1
*1/1000
替换“B”和“M”,使用
gsubfn
,循环通过
向量
,并计算字符串

library(gsubfn)
df1$Expense <-  unname(sapply(gsubfn("([A-Z])$", list(B=1, M=' * 1/1000'), 
          sub("[$]", "", df1$Expense)), function(x) eval(parse(text=x))))
df1
#   BrandName Expense
#1     Apple   1.810
#2    Google   3.210
#3  facebook   0.281
#4  McDonald   0.719
注意:如果两种方法中都有数万亿、数千等,也应扩展此功能,即第一种方法在
列表(…)
中更改,第二种方法通过在
集合名(c(1…),c(“B”,“M”,…)
中创建更多的键/值组进行更改


另一个选项是使用
dplyr

library(dplyr)
library(readr)
df1 %>% 
   mutate(Expense = parse_number(Expense)/c(1, 1000)[grepl("M", Expense)+1])
#   BrandName Expense
#1     Apple   1.800
#2    Google   3.200
#3  facebook   0.281
#4  McDonald   0.719
数据
df1以下是一个基本的R解决方案,它可能更适合您的问题,具体取决于您的需要:

df$ExpenseScaled <- as.numeric(gsub("[$MB]", "", df$Expense))
m.index          <- substr(df$Expense, nchar(df$Expense), nchar(df$Expense)) == 'M'
df$ExpenseScaled[m.index] <- df$ExpenseScaled[m.index] / 1000

 df
 BrandName Expense ExpenseScaled
1     Apple   $1.8B         1.800
2    Google   $3.2B         3.200
3  Facebook   $281M         0.281
4 McDonalds   $719M         0.719

df$ExpenseScaled@akrun:您提出的问题与我的问题完全相反。在您的函数中,您应该将
str\u replace
的返回值赋值为.numeric
x
。此外,
apply(frame[2],2,A)
grepl
应用于整个列(即字符串向量),这就是为什么您可能会得到
条件的长度>1,并且只会使用第一个元素的原因
警告。您应该按行应用
apply
,即
apply(第[2]帧,MAR=1,A)
或使用
sapply
。这就是为什么
grepl
没有像你期望的那样工作。@WeihuangWong:谢谢你指出我的错误,你说得对!一旦我解决了你提到的问题,我会检查它是否有效。再次感谢。正在处理样本,但我的数据有错误。分析时出错(text=x)::2:0:输入意外结束1:-^我忘了提到费用列中缺少“-”形式的值。这就是它不能在我的数据集上工作的原因吗?@cexplorer我还更新了另一个选项。请检查是否也会出现同样的问题。@cexplorer对不起,我有一个输入错误。我打算使用
m.index
ExpenseScaled
列进行子集划分。再试一次,对我来说很有效。太好了!我认为这是解决我问题的最优雅的办法。只是出于好奇,我尝试的解决方案出了什么问题。我知道会有很多问题;)@cexplorer我确实看到了多个问题,例如您将
调用为.numeric(x)
。这实际上不会将
x
变量设置为数字。要做到这一点,你需要一个作业,例如,
x是的,我注意到了那个愚蠢的错误。但为什么在第一种情况下grepl总是返回false?为什么总是在另一个grep里?任何idea@cexplorer我不相信它总是转到
else
状态。我想还有其他一些问题正在发生。
library(dplyr)
library(readr)
df1 %>% 
   mutate(Expense = parse_number(Expense)/c(1, 1000)[grepl("M", Expense)+1])
#   BrandName Expense
#1     Apple   1.800
#2    Google   3.200
#3  facebook   0.281
#4  McDonald   0.719
df1 <- structure(list(BrandName = c("Apple", "Google", "facebook", "McDonald"
), Expense = c("$1.8B", "$3.2B", "$281M", "$719M")), .Names = c("BrandName", 
"Expense"), class = "data.frame", row.names = c(NA, -4L))
df$ExpenseScaled <- as.numeric(gsub("[$MB]", "", df$Expense))
m.index          <- substr(df$Expense, nchar(df$Expense), nchar(df$Expense)) == 'M'
df$ExpenseScaled[m.index] <- df$ExpenseScaled[m.index] / 1000

 df
 BrandName Expense ExpenseScaled
1     Apple   $1.8B         1.800
2    Google   $3.2B         3.200
3  Facebook   $281M         0.281
4 McDonalds   $719M         0.719