我有如下数据列:
天气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。
有几种方法可以指定"列"中的列;整洁选择";样式:
- 如果需要对所有列执行操作的列都以字符串"开头;天气";,你可以做
select(., starts_with("Weather"))
- 如果它们挨着排列,则可以执行
select(., Weather1:Weather3)
- 或手动选择
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>