如何在两列之间交换值

15

我有一个包含三个变量和25万条记录的数据框。以一个例子为例

df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
V1 V2 V3
1  a  2
2  a  3
4  b  1

我想根据V2的值交换V1和V3之间的值,规则如下: 如果V2 == 'b',那么V1 <- V3并且V3 <- V1 结果如下:

V1 V2 V3
1  a  2
2  a  3
1  b  4

我尝试使用do循环,但它需要很长时间。如果我使用Perl,只需要几秒钟。我相信这个任务在R中也可以高效地完成。感谢任何建议。


1
如果您不介意,我很好奇这种情况是如何出现的。我有一些使用软件处理调查数据的经验,但随着我们与IT数据库集成的趋势,数据结构的问题开始浮现,我需要开始有意识地思考如何在表格中存储数据。这就是为什么我很想知道您的情况是如何出现的 :) - Jonathan
3个回答

22

试一试这个

 df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
 df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")] 

它产生的结果为:

> df
  V1 V2 V3
1  1  a  2
2  2  a  3
3  1  b  4

15
你可以使用 transform 来实现这一点。
df <- transform(df, V3 = ifelse(V2 == 'b', V1, V3), V1 = ifelse(V2 == 'b', V3, V1))

我正在尝试运行以下代码: x=read.table("1.txt") x <- transform(x, x[[1]] <- ifelse(x[[1]]>x[[2]], x[[2]], x[[1]]), x[[2]] <- ifelse(x[[1]]>x[[2]], x[[1]], x[[2]])) 但是没有成功! - phoenix

4

编辑我在列名上有些犯难,抱歉。这个可以正常工作。

如果你不介意行以不同的顺序结束,这是一种比较“巧妙”的方法:

dat <- read.table(textConnection("V1 V2 V3
1  a  2
2  a  3
4  b  1"),sep = "",header = TRUE)

tmp <- dat[dat$V2 == 'b',3:1]
colnames(tmp) <- colnames(dat)
rbind(dat[dat$V2 != 'b',],tmp)

基本上,这只是获取那些V2 == 'b'的行,反转列并将其与其他所有内容重新组合在一起。如果您有更多不需要交换的列,则可以扩展此操作;您只需使用整数索引来转置这些值,而不仅仅是3:1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接