将数据帧列中的某些值移到R中的下一列

时间:2018-06-12 15:52:18

标签: r dataframe

我的数据框如下所示:

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 :(得分:0)

阅读您的数据:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

另一种解决方案,其主要思想是根据不具备NA的行捕获数据集的模式,然后使用您捕获的模式执行某些整形。

def sayManyTimes(a: String): IO[String] = IO(a * 3)    
(1 to 2).foldLeft("Read this: ")((c, i) => 
    c + sayManyTimes("mayo").unsafeRunSync)