【问题标题】:Create new variable (boolean) in r在 r 中创建新变量(布尔值)
【发布时间】:2020-11-01 11:58:36
【问题描述】:

如果LineItem的长度大于平均值,我需要创建一个新变量LineItem_LongName,编码为1,否则为0。

我已经尝试过使用代码:

data <- data %>% mutate(LineItem_LongName = ifelse(length(LineItem)) > mean(LineItem)),1,0))

但它给了我一个错误

Warning messages:
1: Problem with `mutate()` input `LineItem_LongName`.
i argument is not numeric or logical: returning NA
i Input `LineItem_LongName` is `ifelse(length(LineItem) > mean(LineItem))`. 
2: In mean.default(LineItem) :
  argument is not numeric or logical: returning NA

我该怎么办?谢谢!

【问题讨论】:

  • 1.您的列 LineItem 是字符串还是数字? 2. ifelse(condition,1,0) 的条件在上面的代码中没有正确设置,不应该有太多的括号,即应该是 ifelse(len(LineItem) > mean(LineItem),1,0)。您的条件当前正在评估 ifelse(length(LineItem)) 这不是布尔评估。
  • 嗨,安迪,我尝试运行代码: data % mutate(LineItem_LongName = ifelse(len(LineItem) > mean(LineItem),1,0) 但它不起作用。它给了我一个错误。L​​ineItem 是一个字符变量
  • 为 len(LineItem) 道歉,因为 R 中没有 len 函数。我的目的是指出代码中的条件没有正确编写,因为括号没有正确定义。尽管如此,还是在下面添加了我的答案。

标签: r variables boolean


【解决方案1】:

您确定要与LineItemlengthLineItem 本身进行比较吗?

你可以用ifelse写成:

library(dplyr)

data <- data %>% 
          mutate(LineItem_LongName = ifelse(LineItem > 
                  mean(LineItem, na.rm = TRUE),1,0))

但是,你不需要ifelse,你可以写:

data <- data %>% 
            mutate(LineItem_LongName = as.integer(LineItem > 
                   mean(LineItem, na.rm = TRUE)))

在基础 R 中:

data$LineItem_LongName <- as.integer(data$LineItem > mean(data$LineItem, na.rm  = TRUE))

【讨论】:

  • 嗨,如果我需要添加 na.rm =True 的代码是什么,因为我可以 NA 值。谢谢
  • 嗨@ronak,抱歉,我是新手,所以感谢您指出这一点。
【解决方案2】:

你差不多了,只是需要更好地了解一些功能。

  • 在 Python 中有一个 len 函数,但在 R 中没有,所以如果在 R 中运行 len(variable) 会出错。
  • 要测量字符串的字符数,您可以使用nchar(str),其中nchar("hello") 将返回5。
  • 但是,R 中有一个函数length,用于测量给定向量的元素数。 length(c("hello","hello")) 将返回 2。

我已经创建了一个示例,请尝试一下,看看它是否是您想要的。平均值为 5,因此它正在检查颜色的长度是否大于 5。

library(tidyverse)
df <- data.frame("Colours" = c("Red Red", "Red", "Green", "Green",NA), 
                 "Number" = c(1,2,3,4,5))

df
  Colours Number
1 Red Red      1
2     Red      2
3   Green      3
4   Green      4 
5    <NA>      5

df_new <- df %>% 
  mutate(LineItemLength = nchar(Colours)) %>% # Count number of characters including space
  mutate(LineItem_LongName = ifelse(LineItemLength > mean(LineItemLength,na.rm = T),1,0))

df_new
  Colours Number LineItemLength LineItem_LongName
1 Red Red      1              7                 1
2     Red      2              3                 0
3   Green      3              5                 0
4   Green      4              5                 0
5    <NA>      5             NA                NA

mean(df_new$LineItemLength,na.rm = T)
5 # Not 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2020-01-18
    相关资源
    最近更新 更多