根据数据框中的长度在列中交换两个条目

时间:2016-02-12 09:13:52

标签: r dataframe swap

我有一个数据框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位数)和ID号码(4位数)。

2 个答案:

答案 0 :(得分:3)

这是一个单线

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

答案 1 :(得分: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