【问题标题】:Is it possible to conditionally shift data in a vector n columns to the right是否可以有条件地将向量 n 列中的数据向右移动
【发布时间】:2019-09-04 11:54:31
【问题描述】:

我是 R 和 tidyverse 的新手,并且有一些我正在尝试整理的数据。似乎存在解析问题,因此某些数据不在正确的列中。例如,在下表中,您可以看到 Jim Smith、Jr 和 Jim Smith Senior 的列被移动,因为第一列没有正确解析:

我正在寻找一种方法来纠正这个问题,以便所有列都正确排列:

然后我可以使用一些 stringr 功能来清理 Name 列:

我的想法是使用 ifelse 来确定 Paid 列是否为空白,如果为 true,则使用某种移位功能将所有列向右移动一个,如果为 false - 则不执行任何操作。 tidyverse 是否具有可以一次筛选多列的功能,还是需要自定义功能。

【问题讨论】:

  • 能否提供一些代码格式的数据?你如何加载数据?也许这样更容易解决。
  • 请给出可重现的例子
  • 图片是一种非常糟糕的发布数据(或代码)的方式。您可以以dput 格式发布示例数据吗?请使用dput(df) 的输出编辑问题。或者,如果 dput(head(df)) 的输出太大。 (df 是您的数据集的名称。)
  • @RuiBarradas 我不知道 dput。我刚刚查看了一个 youtube 视频,并将在未来使用它。谢谢!

标签: r dplyr tidyr


【解决方案1】:

您可以将数据转换为长格式并使用lag 来移动值,具体取决于您指定的条件。一个工作示例:

df <- data.frame(Name = letters[1:5],
                 Gender = c("M","F","26","27","M"),
                 Age = 1:5,
                 Years = c("10","20","yes","no","30"),
                 Paid = c("yes","yes",NA,NA,"no"))

数据:

  Name Gender Age Years Paid
1    a      M   1    10  yes
2    b      F   2    20  yes
3    c     26   3   yes <NA>
4    d     27   4    no <NA>
5    e      M   5    30   no

班次:

df %>%
  mutate(shifted = if_else(is.na(Paid),1,0)) %>%
  gather(key, value,-Name,-shifted) %>%
  mutate(key = factor(key,levels = names(df))) %>%
  group_by(Name) %>%
  arrange(key) %>%
  mutate(value = if_else(shifted == 1, lag(value),value)) %>%
  select(-shifted) %>%
  spread(key,value)

结果:

  Name  Gender Age   Years Paid 
  <fct> <chr>  <chr> <chr> <chr>
1 a     M      1     10    yes  
2 b     F      2     20    yes  
3 c     NA     26    3     yes  
4 d     NA     27    4     no   
5 e     M      5     30    no   

【讨论】:

    【解决方案2】:

    你也可以使用基础 R 来做到这一点。

    数据

    df <- data.frame(Name = letters[1:5],
                 Gender = c("M","F","26","27","M"),
                 Age = 1:5,
                 Years = c("10","20","yes","no","30"),
                 Paid = c("yes","yes",NA,NA,"no"), 
                 stringsAsFactors = F)
    

    换档

    # Identifying which rows to shift
    rows_to_change <- !df$Gender %in% c("M", "F")
    
    # Moving columns one space to the right
    df[rows_to_change,3:5] <- df[rows_to_change,2:4] 
    
    # Deleting wrong values
    df[rows_to_change,2] <- NA
    

    输出

    Name Gender Age Years Paid
    a      M   1    10  yes
    b      F   2    20  yes
    c   <NA>  26     3  yes
    d   <NA>  27     4   no
    e      M   5    30   no
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多