在相邻空白变量中填充文本,直到R中出现另一文本

olmpazwi  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(93)

我尝试粘贴文本到填充空变量上直到另一个文本出现。我想对特定行执行此操作
当前表:
| 变量1|变量2|变量3|变量3|变量4|
| - ------|- ------|- ------|- ------|- ------|
| A类|文本A||文本B||
| B|1个|第二章|三个|四个|
| (c)秘书长的报告|三个|四个|五个|六个|
预期输出:
| 变量1|变量2|变量3|变量3|变量4|
| - ------|- ------|- ------|- ------|- ------|
| A类|文本A|文本A|文本B|文本B|
| B|1个|第二章|三个|四个|
| (c)秘书长的报告|三个|四个|五个|六个|
什么是优雅的方法来做到这一点?我目前的解决方案看起来像这样,但我想使用一个逻辑,而不是像下面这样指定变量名:

mutate(var3=case_when(var1=="A" & is.na(var3) ~ var2))
dy2hfwbg

dy2hfwbg1#

我们可以提取其中"var1"是"A"的行unlist,并从zoo应用na.locf0,以用先前的非NA值替换NA值

library(zoo)
i1 <- df1$var1 == "A"
df1[i1,-1] <-  na.locf0(unlist(df1[i1,-1]))
  • 输出
df1
  var1  var2  var3 var3.1  var4
1    A textA textA  textB textB
2    B     1     2      3     4
3    c     3     4      5     6

或者使用base R,基于非NA元素(cumsum)创建一个数字索引,并使用该索引从提取的行中复制非NA值

v1 <- unlist(df1[i1, -1])
df1[i1, -1] <- na.omit(v1)[cumsum(!is.na(v1))]

或者使用tidyverse,将其重新调整为"长"格式(pivot_longer),应用fill将NA替换为之前的非NA,然后使用pivot_wider重新调整为宽格式

library(dplyr)
library(tidyr)
df1 %>%
   pivot_longer(cols = -var1, values_transform = as.character) %>% 
   fill(value) %>% 
   pivot_wider(names_from = name, values_from = value)
# A tibble: 3 × 5
  var1  var2  var3  var3.1 var4 
  <chr> <chr> <chr> <chr>  <chr>
1 A     textA textA textB  textB
2 B     1     2     3      4    
3 c     3     4     5      6

如果只有备用NA,则还将提供一个选项

library(dplyover)
df1 %>% 
  mutate(across2(c(3, 5), c(2, 4), 
   ~ case_match(.x, NA ~ .y, .default = as.character(.x)),
    .names = "{xcol}"))
  • 输出
var1  var2  var3 var3.1  var4
1    A textA textA  textB textB
2    B     1     2      3     4
3    c     3     4      5     6

数据

df1 <- structure(list(var1 = c("A", "B", "c"), var2 = c("textA", "1", 
"3"), var3 = c(NA, 2L, 4L), var3.1 = c("textB", "3", "5"), var4 = c(NA, 
4L, 6L)), class = "data.frame", row.names = c(NA, -3L))
px9o7tmv

px9o7tmv2#

以下是一个选项,但仅适用于少数列:

library(dplyr)
df %>% 
  mutate(var3 = ifelse(var3=="", var2, var3),
         var4 = ifelse(var4=="", var3.1, var4))
var1  var2  var3  var3.1 var4 
  <chr> <chr> <chr> <chr>  <chr>
1 A     textA textA textB  textB
2 B     1     2     3      4    
3 c     3     4     5      6

相关问题