首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,重新编码将所有内容转换为相同的值。

在R中,重新编码将所有内容转换为相同的值。
EN

Stack Overflow用户
提问于 2020-05-18 20:23:14
回答 2查看 54关注 0票数 0

我正在练习R,我创建了一个新列,其中包含连续的数字,名为ROI,并希望将数字值重新编码为R中的字符串值,如下所示:

代码语言:javascript
复制
df = mutate(diabetes_df, ROI = ifelse(ROI < 18.5, 'Under', ROI))
df = mutate(diabetes_df, ROI = ifelse(ROI >= 18.5 & ROI <= 25, 'average', ROI))

diabetes_df = mutate(diabetes_df, ROI = ifelse(ROI > 25 & BMI <= 30, 'above average', ROI))

这正常工作,只要满足条件,就会显示这些单词,不过,当我将最后一条ifelse语句放入时,它会显示这些单词:

代码语言:javascript
复制
df = mutate(diabetes_df, ROI = ifelse(ROI > 30, 'OVER', ROI))

它将我创建的新列中的每个值转换为OVER值。我想知道是否有人知道如何制作它,这样它只会在满足条件的地方说OVER

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-18 20:52:10

我们可以用mtcars数据框架复制这个问题。第三个mutate()语句上的以下代码导致所有行将wt值设置为High,因为在第一个mutate()之后,wt列是字符值的向量。

代码语言:javascript
复制
library(dplyr)
data(mtcars)
mtcars <- mutate(mtcars,wt = ifelse(wt < 2.6,"Low", wt))
# at this point, wt is character
str(mtcars$wt)


> str(mtcars$wt)
 chr [1:32] "2.62" "2.875" "Low" "3.215" "3.44" "3.46" "3.57" "3.19" "3.15" ...

到第三个mutate()时,根据字符串比较,所有行都满足if_else()为TRUE的条件,其中LowMedium的字符串值大于数字3.61。

代码语言:javascript
复制
mtcars <- mutate(mtcars, wt = ifelse( 2.6 <= wt & wt <= 3.61,"Medium",wt))
mtcars <- mutate(mtcars, wt = ifelse( wt > 3.61,"High",wt))

...and输出:

代码语言:javascript
复制
> head(mtcars)
                   mpg cyl disp  hp drat   wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 High 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 High 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 High 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 High 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 High 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 High 20.22  1  0    3    1

我们可以通过使用case_when()来防止这种行为,它在一次数据传递中将与wt的数字版本进行所有比较。

代码语言:javascript
复制
# use case_when()
data(mtcars)
mtcars %>% mutate(wt = case_when(
     wt < 2.6 ~ "Low",
     wt >= 2.6 & wt <= 3.61 ~ "Medium",
     wt > 3.61 ~ "High"
)) %>% head(.)

...and输出:

代码语言:javascript
复制
head(.)
                   mpg cyl disp  hp drat     wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 Medium 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 Medium 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85    Low 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 Medium 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 Medium 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 Medium 20.22  1  0    3    1
> 

从注释到这个答案,OP不清楚如何将已更改的列保存到现有的数据框架中。下面的代码片段解决了这个问题。

代码语言:javascript
复制
data(mtcars)
mtcars %>% mutate(wt = case_when(
     wt < 2.6 ~ "Low",
     wt >= 2.6 & wt <= 3.61 ~ "Medium",
     wt > 3.61 ~ "High"
)) -> mtcars
票数 1
EN

Stack Overflow用户

发布于 2020-05-18 20:46:41

如果ROI是数字列,则问题是要用文本值覆盖数字列。如果ROI不是数字列,则文本字符串上的不等式比较与您假设的不同。。

请注意,您的所有命令都采用了以下形式:df = mutate(df, ROI = ifelse(ROI <condition>, 'label', ROI)。这意味着您正在覆盖原始ROI值,而替换的值将用于后续的比较。

假设df只有ROI = 10行,那么:

代码语言:javascript
复制
# df:
# ROI = 10

df2 = mutate(df, ROI = ifelse(ROI < 18.5, 'Under', ROI))
# compares 10 < 18.5
# replaces 10 with 'Under'

# df2:
# ROI = 'Under'

df3 = mutate(df2, ROI = ifelse(ROI > 30, 'OVER', ROI))
# compares 'Under' > 30
# After standardizing formats, compares 'Under' > '30' (conversion to string)
# replaces 'Under' with 'OVER'

有两种可能的解决办法:

  1. 写到另一列,这是良好的实践

代码语言:javascript
复制
df %>%
  mutate(ROI_label = NA) %>%
  mutate(ROI_label = ifelse(ROI < 18.5, 'Under', ROI_label)) %>%
  mutate(ROI_label = ifelse(ROI >= 18.5 & ROI <= 25, 'average', ROI_label)) %>%
  mutate(ROI_label = ifelse(ROI > 25 & BMI <= 30, 'above average', ROI_label)) %>%
  mutate(ROI_label = ifelse(ROI > 30, 'OVER', ROI_label))

  1. use case_when,这也是

的良好实践

代码语言:javascript
复制
df %>%
  mutate(ROI = case_when(ROI < 18.5 ~ 'Under',
                         ROI >= 18.5 & ROI <= 25 ~ 'average',
                         ROI > 25 & BMI <= 30 ~ 'above average',
                         ROI > 30 ~ 'OVER'))

更好的是,编写另一列并使用case_when

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

https://stackoverflow.com/questions/61878357

复制
相关文章

相似问题

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