在 r 中创建新变量(布尔值)

Create new variable (boolean) in r

我需要创建一个新变量 LineItem_LongName 如果 LineItem 的长度大于平均值则编码为 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

我该怎么办?谢谢!

您确定要与 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))

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

  • Python 中有一个 len 函数,但 R 中没有,所以如果你在 R 中 运行 len(variable) 会出错。
  • 要测量一个字符串的字符数,可以使用nchar(str) where nchar("hello") will return you 5.
  • 然而,R 中有一个函数length,用于测量给定向量的元素数。 length(c("hello","hello")) 将 return 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