使用r中另一个值的值将多个分类变量合并为一个



我有如下数据列:

天气1天气2天气3Sunny Sunny NA多云NA有些云哈兹哈兹暖NA暖NA NA NA

以下是重新创建数据的代码片段:

example = data.frame(Weather1 = c('Sunny','Cloudy','Hazy','Warm','NA'),
Weather.2 = c('Sunny','NA','Hazy','NA','NA'),
Weather3 = c('NA','some cloud','Hazy','NA', 'NA'))

我想把三个变量组合起来,如下所示:

Weather1 Weather.2 Weather3 combine_WeatherSunny Sunny NA Sunny多云NA有些云多云朦胧朦胧暖NA暖NA暖NA NA NA NA

如果有任何不匹配,我想使用第一个变量的值。

您可以使用coalesce用第一个不缺失的值水平填充NA

注意,我已经更改了你的字符串";NA";首先转换为实CCD_ 3。

有几种方法可以指定"列"中的列;整洁选择";样式:

  1. 如果需要对所有列执行操作的列都以字符串"开头;天气";,你可以做select(., starts_with("Weather"))
  2. 如果它们挨着排列,则可以执行select(., Weather1:Weather3)
  3. 或手动选择select(., Weather1, Weather.2, Weather3)
library(dplyr)
example %>% mutate(across(everything(), ~ifelse(.x == "NA", NA, .x)),
combine_weather = coalesce(!!!select(., everything())))
Weather1 Weather.2   Weather3 combine_weather
1    Sunny     Sunny       <NA>           Sunny
2   Cloudy      <NA> some cloud          Cloudy
3     Hazy      Hazy       Hazy            Hazy
4     Warm      <NA>       <NA>            Warm
5     <NA>      <NA>       <NA>              NA

另一种方法可以是首先定义combine_weather的模式:则CCD_ 9之后的CCD_ 8:

library(tidyverse)
pattern <- c("Sunny|Cloudy|Hazy|Warm")
example %>% 
na_if("NA") %>% 
unite(combine_weather, starts_with("Weather"), sep = " ", na.rm = TRUE,  remove = FALSE) %>%
mutate(combine_weather = str_extract(combine_weather, pattern))
combine_weather Weather1 Weather.2   Weather3
1           Sunny    Sunny     Sunny       <NA>
2          Cloudy   Cloudy      <NA> some cloud
3            Hazy     Hazy      Hazy       Hazy
4            Warm     Warm      <NA>       <NA>
5            <NA>     <NA>      <NA>       <NA>

使用data.table:

library(data.table)
setDT(example)[
, combined.weather:=fcoalesce(.SD)
, .SDcols=c('Weather1', 'Weather.2', 'Weather3')]
example
##    Weather1 Weather.2   Weather3 combined.weather
## 1:    Sunny     Sunny       <NA>            Sunny
## 2:   Cloudy      <NA> some cloud           Cloudy
## 3:     Hazy      Hazy       Hazy             Hazy
## 4:     Warm      <NA>       <NA>             Warm
## 5:     <NA>      <NA>       <NA>             <NA>

相关内容

  • 没有找到相关文章

最新更新