Переместить определенные значения в столбце данных в следующий столбец в R - PullRequest
0 голосов
/ 12 июня 2018

У меня есть кадр данных, который выглядит следующим образом:

x y z
1 2 3
1 2 3
1 2 3
2 3
1 2 3
1 3

Я хотел бы спросить, есть ли в R команда, которая позволит получить следующий кадр данных (путем смещения и выравнивания аналогичных значений)

x y z
1 2 3
1 2 3
1 2 3
NA 2 3
1 2 3
1 NA 3

Ответы [ 3 ]

0 голосов
/ 12 июня 2018
library(tidyverse)

df %>% 
  pmap_dfr(~{ x <- list(...)
              if(any(is.na(x))) intersect(x, df[1,]) # match with first row's values to assign names
              else x}) 

Выход:

# # A tibble: 6 x 3
#       x     y     z
#   <int> <int> <int>
# 1     1     2     3
# 2     1     2     3
# 3     1     2     3
# 4    NA     2     3
# 5     1     2     3
# 6     1    NA     3
0 голосов
/ 12 июня 2018

Альтернативное решение, где основная идея состоит в том, чтобы захватить шаблон вашего набора данных на основе строк, в которых нет NA, а затем выполнить некоторое изменение формы, используя захваченный шаблон.

df = read.table(text = "
x y z
1 2 3
1 2 3
1 2 3
2 3 NA
1 2 3
1 3 NA
", header= T)

library(tidyverse)

# get the column names of your dataset
names = names(df)

# get unique values after omitting rows with NAs
value = unlist(unique(na.omit(df)))

# create a dataset with names and values
# (this is the pattern you want to follow)
df3 = data.frame(names, value)


df %>%
  mutate(id = row_number()) %>%   # flag the row number
  gather(v,value,-id) %>%         # reshape
  na.omit() %>%                   # remove rows with NAs
  left_join(df3, by="value") %>%  # join info about your pattern
  select(-v) %>%                  # remove that column
  spread(names, value) %>%        # reshape
  select(-id)                     # remove row number

#    x  y z
# 1  1  2 3
# 2  1  2 3
# 3  1  2 3
# 4 NA  2 3
# 5  1  2 3
# 6  1 NA 3
0 голосов
/ 12 июня 2018

чтение ваших данных:

df<- fread("x y z
    1 2 3
    1 2 3
    1 2 3
    2 3 NA
    1 2 3
    1 3 NA") %>% setDF

код:

library(magrittr)
getmode <- function(v) {
    uniqv <- unique(v)
    uniqv[which.max(tabulate(match(v, uniqv)))]
}

pattern <- sapply(df,getmode)

df[!complete.cases(df),] %<>% apply(1,function(x){tmp<-pattern;tmp[!(tmp%in%x)] <- NA;return(tmp)}) %>% t %>% data.frame

результат:

> df
   x  y z
1  1  2 3
2  1  2 3
3  1  2 3
4 NA  2 3
5  1  2 3
6  1 NA 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...