首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量数据的循环ifelse()的替代方法

向量数据的循环ifelse()的替代方法
EN

Stack Overflow用户
提问于 2018-01-13 00:51:28
回答 2查看 885关注 0票数 2

我有一个价格数据帧dat和第二个带有货币cur的数据帧。我想要做的是用for()函数和嵌套的ifelse()dat中的每个非欧元价格转换为欧元。如果价格已经是欧元,则函数不应执行任何操作,而是将原始值返回到dat中的列Price €中。

日期:

代码语言:javascript
复制
Nation   Price  Price€  
AT       10
AT       12
BE       15
BG       30
BG       40
CZ       200

cur:

代码语言:javascript
复制
Nation Rate
BG     0.51
CZ     0.03918

cur中只包含非欧盟货币的国家/地区。我使用了以下代码:

代码语言:javascript
复制
 for (i in 1:length(cur)){
  if(dat$Nation == cur$Nation[i]){
    dat$Price * cur$Rate[i]
     }
     else { }
  }

输出应如下所示:

日期:

代码语言:javascript
复制
Nation  Price  Price€
AT      10     NA
AT      12     NA
BE      15     NA
BG      30     15.3
BG      40     20.4
CZ      200    7.836

这个想法是在循环结束后用来自Price的值填充Price€列(那些是使用欧元货币的国家)-这是因为没有告诉函数在else的情况下该怎么做。

代码语言:javascript
复制
 index <- is.na(dat$Price€)
 dat$Price€[index] <- dat$Price[index]

日期:

代码语言:javascript
复制
Nation  Price  Price€
AT      10     10
AT      12     12
BE      15     15
BG      30     15.3
BG      40     20.4
CZ      200    7.836

我这里的问题是,R给出了一个错误消息:

代码语言:javascript
复制
Warning messages:
1: In if (dat$Nation == cur$Nation[i]) { :
the condition has length > 1 and only the first element will be used
2: In if (dat$Nation == cur$Nation[i]) { :
the condition has length > 1 and only the first element will be used

它所做的是将所有价格值乘以第一个汇率(0.51),然后停下来为两个数据帧中的列Nation查找相同的值,以应用不同的汇率。这只是我的数据集中的一个简单示例。欧盟(n=1740)内的每个国家/地区都有多个条目。

这听起来可能是一种复杂的方式,但我是R的新手,我想知道如何修复这个函数,或者是什么替代函数。

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-13 01:00:38

代码的问题在于,您正在将一个向量与if (dat$Nation == cur$Nation[i])中的一个字符进行比较,因此该错误告诉您,它只会将dat$Nation的第一个元素与cur$Nation[i]进行比较。

在R中,for循环通常不是必需的(并且很慢)。例如,您可以执行以下操作:

代码语言:javascript
复制
dat$conv <- cur$Rate[match(dat$Nation,cur$Nation)] # add the conversion factor
dat$PriceE <- ifelse(is.na(dat$conv), dat$Price, dat$Price * dat$conv)
dat$conv <- NULL

输出:

代码语言:javascript
复制
  Nation Price PriceE
1     AT    10 10.000
2     AT    12 12.000
3     BE    15 15.000
4     BG    30 15.300
5     BG    40 20.400
6     CZ   200  7.836

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2018-01-13 01:05:30

我认为作为合并/连接操作,这会容易得多。使用整洁的诗句你可以做到

代码语言:javascript
复制
library(tidyverse)
dat <- read_table("Nation   Price
AT       10
AT       12
BE       15
BG       30
BG       40
CZ       200")
cur <- read_table("Nation Rate
BG     0.51
CZ     0.03918")


dat %>% left_join(cur) %>% 
  mutate(Rate=coalesce(Rate, 1)) %>%
  mutate(EPrice = Price * Rate)

这里唯一的技巧是将那些不在cur表中的国家的利率更改为1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48230656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档