Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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
R 通过比较数值列和固定值来创建类别_R_Dataframe - Fatal编程技术网

R 通过比较数值列和固定值来创建类别

R 通过比较数值列和固定值来创建类别,r,dataframe,R,Dataframe,考虑iris数据: iris Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7

考虑
iris
数据:

 iris 
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    1            5.1         3.5          1.4         0.2     setosa
    2            4.9         3.0          1.4         0.2     setosa
    3            4.7         3.2          1.3         0.2     setosa
    4            4.6         3.1          1.5         0.2     setosa
    5            5.0         3.6          1.4         0.2     setosa
    6            5.4         3.9          1.7         0.4     setosa
    7            4.6         3.4          1.4         0.3     setosa
我想根据变量
Sepal.Length
中的值与固定限制/截止值的比较创建一个新列,例如,检查值是否大于或小于5:

如果萼片长度>=5,则分配“向上”,否则分配“向下”
到一个新的列“调节”

怎么做?

试试看

iris$Regulation <- ifelse(iris$Sepal.Length >=5, "UP", "DOWN")
iris$Regulation=5,“向上”、“向下”)

为了更新可能的规范,包
dplyr
具有函数
mutate
,允许您以矢量化方式在data.frame中创建新列:

library(dplyr)
iris_new <- iris %>%
    mutate(Regulation = if_else(Sepal.Length >= 5, 'UP', 'DOWN'))
它的工作原理与
if_else
类似,不同的是不是有一个返回值为TRUE和FALSE的条件,每一行都有一个条件(在
~
的左侧)和一个返回值(在
~
的右侧),如果为TRUE,则返回该条件。如果为false,它将进入下一个条件

在这种情况下,
Sepal.Length>=5
的行将返回
'High'
,而
Sepal.Length<5
(因为第一个条件必须失败)和
Sepal.Length>=4.5
的行将返回
'Mid'
,所有其他行将返回
'Low'
。由于
TRUE
始终是
TRUE
,因此它用于提供默认值。

不带ifelse:

iris$Regulation=5)+1]
基准测试,大约比ifelse快14倍:

bigX=5)+1],
x2=ifelse(bigX>=5,“向上”、“向下”),
x3=dplyr::if_else(bigX>=5,“向上”、“向下”)
)
##tibble:3 x 14
#表达式最小平均中位数最大`itr/sec`mem_alloc n_gc n_itr总时间结果内存
#                       

#x1 19.1ms 23.9ms 20.5ms 31.6ms 41.9 22.9MB 9 22 525ms如果要检查df中的哪些元素与不同长度的向量中的元素相匹配,是否可以使用向量替换“>=5”?如何将萼片长度、萼片宽度、花瓣长度、花瓣宽度的最小值添加到新列中?我试过了,最低限额是50美元
iris %>%
    mutate(Regulation = case_when(Sepal.Length >= 5 ~ 'High',
                                  Sepal.Length >= 4.5 ~ 'Mid',
                                  TRUE ~ 'Low'))
iris$Regulation <- c("DOWN", "UP")[ (iris$Sepal.Length >= 5) + 1 ]
bigX <- runif(10^6, 0, 10)

bench::mark(
  x1 = c("DOWN", "UP")[ (bigX >= 5) + 1 ],
  x2 = ifelse(bigX >=5, "UP", "DOWN"),
  x3 = dplyr::if_else(bigX >= 5, "UP", "DOWN")
)
# # A tibble: 3 x 14
# expression     min    mean  median     max `itr/sec` mem_alloc  n_gc n_itr total_time result memory
# <chr>      <bch:t> <bch:t> <bch:t> <bch:t>     <dbl> <bch:byt> <dbl> <int>   <bch:tm> <list> <list>
# x1          19.1ms  23.9ms  20.5ms  31.6ms     41.9     22.9MB     9    22      525ms <chr ~ <Rpro~
# x2         278.9ms 280.2ms 280.2ms 281.5ms      3.57   118.3MB     4     2      560ms <chr ~ <Rpro~
# x3          47.8ms  64.2ms  54.1ms 138.8ms     15.6     68.7MB    11     8      514ms <chr ~ <Rpro~