Как заполнить столбцы в кадре данных слева направо - PullRequest
0 голосов
/ 26 июня 2019

У меня есть фрейм данных, для которого я хотел бы заполнить столбцы слева направо, используя продолжительное значение без NA и добавляя суффикс (foo) после него. Например, этот фрейм данных:

df <- data.frame(
  x = c("one", "one", "three"),
  y = c("two", "four", NA),
  z = c("three", NA, NA)
)

df
#>       x    y     z
#> 1   one  two three
#> 2   one four  <NA>
#> 3 three <NA>  <NA>

будет производить:

data.frame(
  x = c("one", "one", "three"),
  y = c("two", "four", "three (foo)"),
  z = c("three", "four (foo)", "three (foo)")
)
#>       x           y           z
#> 1   one         two       three
#> 2   one        four  four (foo)
#> 3 three three (foo) three (foo)

Есть ли элегантный способ сделать это? Это может быть база R, Tidyverse или data.table решение. Создано в 2019-06-26 пакетом представ. (v0.3.0)

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вот подход с использованием пакета base и dplyr:

library(dplyr)

df <- data.frame(
  x = c("one", "one", "three"),
  y = c("two", "four", NA),
  z = c("three", NA, NA)
)

nalast = function(x){
  l1 = x
  nas = is.na(l1)
  l1[nas] = paste0(x[tail(which(!nas),n=1)]," (foo)")
  return(l1)
}

df2 = apply(X = df, MARGIN = 2, FUN = nalast)

df2

, который дает

> df2
     x       y            z            
[1,] "one"   "two"        "three"      
[2,] "one"   "four"       "three (foo)"
[3,] "three" "four (foo)" "three (foo)"
> 
1 голос
/ 26 июня 2019

Вот подход tidyverse,

library(tidyverse)

df %>% 
 mutate(new = row_number()) %>% 
 gather(var, val, - new) %>% 
 group_by(new) %>% 
 mutate(flag = as.integer(is.na(val))) %>% 
 fill(val) %>% 
 mutate(val = replace(val, flag == 1, paste(val[flag == 1], '(foo)')))  %>% 
 select(-flag) %>% 
 spread(var, val)

что дает,

# A tibble: 3 x 4
# Groups:   new [3]
    new x     y           z          
  <int> <chr> <chr>       <chr>      
1     1 one   two         three      
2     2 one   four        four (foo) 
3     3 three three (foo) three (foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...