【问题标题】:If value in a column starts with...mutate another column with given text, in R如果列中的值以...开头,则在 R 中使用给定文本改变另一列
【发布时间】:2019-02-20 11:37:31
【问题描述】:

我正在尝试构建一个 if 函数,如果“zipcode”列中的值以某个数字开头,则该函数允许我使用某个城市名称来改变数据框的“city”列。

例如:如果邮政编码以 1 开头,则将城市列值更改为“NYC”, 否则,如果邮政编码以 6 开头,则将城市列值更改为“芝加哥”, 否则,如果邮政编码以 2 开头,则将城市列值更改为“波士顿”,

等等。

发件人:

city              zipcode
NYC               11211
DC                20910
NYC               11104
NA                11106
NA                2008
NA                60614

收件人:

city             zipcode
NYC               11211
DC                20910
NYC               11104
NYC               11106
DC                2008
Chicago           60614

这是一种处理 NA 值的方法:if 函数只会为它们已经存在的值重写同一个城市,并键入城市名称以防存在 NA 值

数据框名称data.frame 列名 zipcodecity。 它们都是因子类型,对于我的进一步模型必须保持这种类型。

我想直接改变数据框,因为我需要它以供进一步使用。

PS: 写得不好请见谅。我是社区的新人。

提前致谢!

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出
  • 你可以用dplyrcase_when函数来做到这一点:rdocumentation.org/packages/dplyr/versions/0.7.8/topics/…
  • @akrun 应该更新
  • 我们可以使用base::substrdplyr::case_when, library(dplyr);df %>% mutate(zip=substr(zipcode,1,1), city_upd=case_when(zip==1 ~ 'NYC',zip==2 ~ 'DC', zip==6 ~ 'Chicago' ,TRUE ~ NA_character_))
  • @A.Suliman 不幸的是它不起作用。 Dataframe 没有经过任何修改。

标签: r if-statement dplyr tidyverse


【解决方案1】:

这里有一个可能适合您的解决方案。

完整代码:

# load library
library(tidyverse)

# create the sample dataframe
df <- tribble(~city, ~zipcode,
              'NYC',11211,
              'DC',20910,
              'NYC', 11104,
              NA, 11106,
              NA, 2008,
              NA, 60614)

# change the NAs to the appropriate values
df <- df %>%
  mutate(
    city = case_when(
      str_sub(zipcode, 1, 1) == '1' ~ 'NYC',
      str_sub(zipcode, 1, 1) == '2' ~ 'DC',
      str_sub(zipcode, 1, 1) == '6' ~ 'Chicago',
      TRUE ~ city
    )
  )

# convert everything to factors
df <- df %>%
  mutate(
    city = as.factor(city),
    zipcode = as.factor(zipcode)
  )

#preview the output
glimpse(df)

glimpse() 的输出是:

Observations: 6
Variables: 2
$ city    <fct> NYC, DC, NYC, NYC, DC, Chicago
$ zipcode <fct> 11211, 20910, 11104, 11106, 2008, 60614

我使用的技巧是首先将所有内容保留为字符串或数字,填写缺失值,然后转换为因子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多