【问题标题】:R if else code for combining two variables into oneR if else 将两个变量合二为一的代码
【发布时间】:2020-04-25 18:42:20
【问题描述】:

我有两个变量 - Small_Vehicle 和 Large_Vehicle,它们被编码为 0 和 1。我想将它们组合成一个变量,如果车辆很小 - 1,如果它很大 - 2。如果没有数据,我希望 R 离开是 NA。我已经编写了下面的代码,但它给了我错误:

错误:“TRIdata$Combined

Combined 变量已存在于数据集中,但当前值错误。

if (TRIdata$Small_Vehicle = 1) {
TRIdata$Combined<-1 } else {
if (TRIdata$Large_Vehicle=1)  {
TRIdata$Combined<-2 } else {
TRIdata$Combined <- NA }}

请问您对我做错的地方有什么建议吗?

谢谢!

【问题讨论】:

  • 在比较运算符中使用 == 而不是 =
  • 你好莫妮卡。欢迎来到 StackOverflow。 R 中的if() 函数应解析为单个值 TRUE 或 FALSE。由于TRIdata$Small_Vehicle 是一个向量,在更正代码中的=== 错误后,它会失败并警告条件长度> 1,并且只会使用第一个元素。 您需要实现一种使用矢量化计算的方法,或者逐个循环遍历这些值。矢量化操作比循环更快。我的答案包含两种不同的矢量化计算方法。

标签: r if-statement variables


【解决方案1】:

假设small_vehiclelarge_vehicle是互斥且穷举的类别,我们可以在没有if/then逻辑的情况下创建Combined,如下所示。

small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)

TRIdata <- data.frame(small_vehicle,large_vehicle)
TRIdata$Combined <- 2*TRIdata$large_vehicle + small_vehicle

TRIdata

...和输出:

> TRIdata
  small_vehicle large_vehicle Combined
1             1             0        1
2             0             1        2
3             0             1        2
4             1             0        1
5             1             0        1
6             1             0        1
7             0             1        2
> 

替代方法

我们可以用ifelse() 做同样的事情。

# alternate approach 
small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)

TRIdata <- data.frame(small_vehicle,large_vehicle)
TRIdata$Combined <- ifelse(TRIdata$small_vehicle == 1,1,2)
TRIdata

...和输出。

> TRIdata
  small_vehicle large_vehicle Combined
1             1             0        1
2             0             1        2
3             0             1        2
4             1             0        1
5             1             0        1
6             1             0        1
7             0             1        2
> 

为什么原始代码不起作用?

我将使用以下代码说明我对原始帖子的评论。我们将更正原始版本中的 === 错误,然后尝试运行它。

# original code with my sample data
small_vehicle <- c(1,0,0,1,1,1,0)
large_vehicle <- c(0,1,1,0,0,0,1)
TRIdata <- data.frame(Small_Vehicle = small_vehicle,
                      Large_Vehicle = large_vehicle)

if (TRIdata$Small_Vehicle == 1) {
     TRIdata$Combined <- 1
} else {
     if (TRIdata$Large_Vehicle == 1)  {
          TRIdata$Combined <- 2
     } else {
          TRIdata$Combined <- NA
     }
}

...产生以下警告:

Warning message:
In if (TRIdata$Small_Vehicle == 1) { :
  the condition has length > 1 and only the first element will be used
> 

当我们打印结果时,我们观察到 R 将 TRIdata$Small_Vehicle 的第一个元素评估为 TRUE,并将值 1 分配给 TRIdata$Combined 中的每个元素。

> TRIdata
  Small_Vehicle Large_Vehicle Combined
1             1             0        1
2             0             1        1
3             0             1        1
4             1             0        1
5             1             0        1
6             1             0        1
7             0             1        1
>

【讨论】:

    【解决方案2】:

    试试这个。

    if (TRIdata$Small_Vehicle == 1) {
        TRIdata$Combined<-1 } elseif (TRIdata$Large_Vehicle=1) {
        TRIdata$Combined<-2 } else {
        TRIdata$Combined <- NA }
    

    【讨论】:

    • 这与操作一样,会在if 语句中导致问题,因为向量正在传递。我想它可以包含在for 语句和索引向量([i])中,或者使用ifelse
    • 此代码片段包含多个错误。首先,elseif 不是 R 控件构造。其次,它的参数有=而不是==,第三,纠正这些错误后,它会产生不准确的结果,正如@user20650所指出的那样。
    猜你喜欢
    • 2015-12-30
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2021-12-08
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多