2016-02-12 37 views
1

我有一个数据帧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)],但我无法弄清楚这一点。对于那些好奇的人来说,输入基本上是一个通话报告,有时在输入数据时,他们交换了单元号码(10位数字)和ID号码(4位数字)。

回答

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 
+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 
+0

优雅的解决方案,mtoto有点快! –

+0

@ user3875610没问题。我只是希望它有帮助。 – Sotos

相关问题