【问题标题】:Swap two entry in a column based on the length in a data frame根据数据框中的长度交换列中的两个条目
【发布时间】:2016-02-12 09:13:51
【问题描述】:

我有一个数据框 df,其中包含 ab 列,如果值的长度大于 3,我想在列之间交换值

输入:

a       b
1       23
2       44
3       43324
4       76

预期输出:

a      b
1      23
2      44
43324  3
4      76

我在想类似下面的东西:

df <- transform(df, df$a = ifelse(length(df$b) > 3, a, b), df$a = ifelse(length(df$b) > 3, b, a))

但这不起作用,我知道我必须使用df[length(df$a)] 之类的东西,但我无法弄清楚。

P.S: 好奇的小伙伴,输入基本就是通话报告,有时候在输入数据的时候,会调换手机号(10位)和身份证号(4位)。

【问题讨论】:

    标签: r dataframe swap


    【解决方案1】:

    这里是单排

    df[nchar(df$b)>3, c("a", "b")] <- df[nchar(df$b)>3, c("b", "a")]
    > df
    #      a  b
    #1     1 23
    #2     2 44
    #3 43324  3
    #4     4 76
    

    【讨论】:

    • 优雅的解决方案,mtoto 快一点!
    • @user3875610 没问题。我只是希望它有所帮助。
    【解决方案2】:

    也许您可以构建一个适用于您的示例的自定义函数:

    swap <- function(df) {
    
      a <- ifelse(nchar(df$b) > 3, df$b, df$a)
      b <- ifelse(nchar(df$b) > 3, df$a, df$b)
      df$a <- a
      df$b <- b
    
    return(df)
    
    }
    
    #Let's test it
    swap(df)
    #      a  b
    #1     1 23
    #2     2 44
    #3 43324  3
    #4     4 76
    

    【讨论】:

    • 非常感谢您!我真的很喜欢你使用列名而不是索引,方便其他人修改
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2020-03-07
    • 2018-07-11
    相关资源
    最近更新 更多