根据数据框中的长度交换列中的两个条目
Swap two entry in a column based on the length in a data frame
我有一个数据框 df
,其中包含列 a
和 b
,如果值的长度超过 3[=17],我想在列之间交换值=]
输入:
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位)。
也许您可以构建一个适用于您的示例的自定义函数:
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
这是单行本
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
我有一个数据框 df
,其中包含列 a
和 b
,如果值的长度超过 3[=17],我想在列之间交换值=]
输入:
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位)。
也许您可以构建一个适用于您的示例的自定义函数:
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
这是单行本
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