gpt4 book ai didi

r - 根据另一列 r 的值在列之间切换元素

转载 作者:行者123 更新时间:2023-12-05 03:27:19 27 4
gpt4 key购买 nike

我有一个这样的数据框:

D <- data.frame(V1=c(1,2,3,4), V2=c(6,7,8,9), V3=c(3,4,5,6), sign=c("+", "-", "-", "+"))

如果“sign”列的字符是“-”,我想交换V1和V2列的值

我想要的输出是:

          V1 V2 V3 sign
1 1 6 3 +
2 7 2 4 -
3 8 3 5 -
4 4 9 6 +

我试过 for 循环以及 if 和 else 语句,但它不起作用。您能告诉我如何实现这一目标吗?

最佳答案

使用 mapply 一次循环遍历 3 列并将结果分配给列 V1V2

D <- data.frame(V1=c(1,2,3,4), V2=c(6,7,8,9), V3=c(3,4,5,6), sign=c("+", "-", "-", "+"))

D[c("V1", "V2")] <- t(mapply(\(x, y, s){
if(s == "-") c(y, x) else c(x, y)
}, D$V1, D$V2, D$sign))
D
#> V1 V2 V3 sign
#> 1 1 6 3 +
#> 2 7 2 4 -
#> 3 8 3 5 -
#> 4 4 9 6 +

reprex package 创建于 2022-03-18 (v2.0.1)


编辑

虽然答案已经被接受,但这里是上面的代码作为一个函数和其他两个函数,按照速度递增的顺序。原来的最慢,第三个最快。

swapCols1 <- function(X, flag){
X[] <- t(mapply(\(x, y, s){
if(s) c(y, x) else c(x, y)
}, X[[1]], X[[2]], flag))
X
}

swapCols2 <- function(X, flag){
s <- seq.int(nrow(X))
i <- cbind(c(s, s), c(flag, !flag) + 1L)
matrix(X[i], nrow = nrow(X))
}

swapCols3 <- function(X, flag){
tmp <- X[[1]][flag]
X[[1]][flag] <- X[[2]][flag]
X[[2]][flag] <- tmp
X
}

关于r - 根据另一列 r 的值在列之间切换元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71523096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com