R语言 如何将NA行转换为列?

gcmastyq  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(141)

我的数据看起来像这样:

data <- data.frame(AP = c("1.0", "1.0", "1.0", "2.2", "2.2", "3.1", "3.1", "3.1", "3.1", "3.1"),
                   PROFISSIONAL = c("JULIA", "JULIA", "JULIA", "ROSANA", "ROSANA", "JEFERSON", "JEFERSON", "JEFERSON", "JEFERSON", "JEFERSON"),
                   NOME = c("MARIA A", NA, NA, "RENATA", NA, "CLAUDIA", NA, NA, NA, NA),
                   MEDICAMENTO = c("LOSARTANA", "PARACETAMOL", "NEOSORO", "LOSARTANA", "ATENOLOL", "SINVASTATINA", "AAS", "ENALAPRIL", "HIDROCLOROTIAZIDA", "FLUOXETINA"))

字符串
“NOME”变量下的每个NA是与上述名称相同的人。例如,CLAUDIA之后的4个NA属于CLAUDIA。我需要将这些行转换为列,以确定它所属的特定名称。


的数据
这将是所需的输出:

data2 <- data.frame(AP = c("1.0", "2.2", "3.1"),
                   PROFISSIONAL = c("JULIA", "ROSANA", "JEFERSON"),
                   NOME = c("MARIA A", "RENATA", "CLAUDIA"),
                   MEDICAMENTO1 = c("LOSARTANA", "LOSARTANA", "SINVASTATINA"),
                   MEDICAMENTO2 = c("PARACETAMOL", "ATENOLOL", "AAS"),
                   MEDICAMENTO3 = c("NEOSORO", NA, "ENALAPRIL"),
                   MEDICAMENTO4 = c(NA, NA,  "HIDROCLOROTIAZIDA"),
                   MEDICAMENTO5 = c(NA, NA,  "FLUOXETINA"))

有没有什么方法可以做到这一点,所有的变量使用“NOME”作为NA条件?
编辑:除了MEDICAMENTO变量,还有其他变量:DIF、STATUS、STATUS2、INDICAÇú、STATUS9、DOSE1、DOSE2、FREQ1、FREQ2、DOSEREAL1和DOSEREAL2。AP和PROFISSIONAL变量可以分配给不同的名称。例如,不同的NOME可以被分配给相同的PROFISSONAL和AP。

rqmkfv5c

rqmkfv5c1#

library(tidyverse)
data |>
  fill(NOME) |>
  mutate(col = paste0("MEDICAMENTO", row_number()), .by = AP) |>
  pivot_wider(names_from = col, values_from = MEDICAMENTO)

# A tibble: 3 × 8
  AP    PROFISSIONAL NOME    MEDICAMENTO1 MEDICAMENTO2 MEDICAMENTO3 MEDICAMENTO4    MEDICAMENTO5
  <chr> <chr>        <chr>   <chr>        <chr>        <chr>        <chr>           <chr>       
1 1.0   JULIA        MARIA A LOSARTANA    PARACETAMOL  NEOSORO      NA              NA          
2 2.2   ROSANA       RENATA  LOSARTANA    ATENOLOL     NA           NA              NA          
3 3.1   JEFERSON     CLAUDIA SINVASTATINA AAS          ENALAPRIL    HIDROCLOROTIAZ… FLUOXETINA

字符串

xzlaal3s

xzlaal3s2#

如果您的 NOME 数据有多个非NA值,请使用purrr::map选择它们
注意,使用稍微修改的数据集来反映这一点

library(dplyr)
library(tidyr)

data %>% 
  summarize(across(everything(), ~ list(.x)), .by = c(AP, PROFISSIONAL)) %>% 
  mutate(NOME = purrr::map(NOME, ~ .x[!is.na(.x)])) %>% 
  unnest_wider(-c(AP, PROFISSIONAL), names_sep="")

# A tibble: 3 × 9
  AP    PROFISSIONAL NOME1   NOME2 MEDICAMENTO1 MEDICA…¹ MEDIC…² MEDIC…³ MEDIC…⁴
  <chr> <chr>        <chr>   <chr> <chr>        <chr>    <chr>   <chr>   <chr>  
1 1.0   JULIA        MARIA A JJ O  LOSARTANA    PARACET… NEOSORO NA      NA     
2 2.2   ROSANA       RENATA  NA    LOSARTANA    ATENOLOL NA      NA      NA     
3 3.1   JEFERSON     CLAUDIA GERO  SINVASTATINA AAS      ENALAP… HIDROC… FLUOXE…
# … with abbreviated variable names ¹​MEDICAMENTO2, ²​MEDICAMENTO3,
#   ³​MEDICAMENTO4, ⁴​MEDICAMENTO5

字符串

数据

data <- structure(list(AP = c("1.0", "1.0", "1.0", "2.2", "2.2", "3.1", 
"3.1", "3.1", "3.1", "3.1"), PROFISSIONAL = c("JULIA", "JULIA", 
"JULIA", "ROSANA", "ROSANA", "JEFERSON", "JEFERSON", "JEFERSON", 
"JEFERSON", "JEFERSON"), NOME = c("MARIA A", "JJ O", NA, "RENATA", 
NA, "CLAUDIA", NA, "GERO", NA, NA), MEDICAMENTO = c("LOSARTANA", 
"PARACETAMOL", "NEOSORO", "LOSARTANA", "ATENOLOL", "SINVASTATINA", 
"AAS", "ENALAPRIL", "HIDROCLOROTIAZIDA", "FLUOXETINA")), row.names = c(NA, 
-10L), class = "data.frame")

juzqafwq

juzqafwq3#

对不起,我的代码很糟糕。这个有用吗?我叫它data

map_df(unique(data$PROFISSIONAL),~
      data |>
      filter(PROFISSIONAL==.) |>
      mutate(med = paste0("medicamentio",1:length(unique(MEDICAMENTO)))) |> 
      pivot_wider(id_cols = AP,
                  values_from = MEDICAMENTO,
                  names_from = med)
      
      
      ) |> 
  mutate(NOME = unique(data$NOME[complete.cases(data$NOME)]),.after=AP)

字符串
输出量:

A tibble: 3 x 7
  AP    NOME    medicamentio1 medicamentio2 medicamentio3 medicamentio4     medicamentio5
  <chr> <chr>   <chr>         <chr>         <chr>         <chr>             <chr>        
1 1.0   MARIA A LOSARTANA     PARACETAMOL   NEOSORO       NA                NA           
2 2.2   RENATA  LOSARTANA     ATENOLOL      NA            NA                NA           
3 3.1   CLAUDIA SINVASTATINA  AAS           ENALAPRIL     HIDROCLOROTIAZIDA FLUOXETINA


的数据

相关问题