【问题标题】:How to swap values between two columns如何在两列之间交换值
【发布时间】:2011-12-06 11:45:00
【问题描述】:

我有一个包含三个变量和 250K 记录的数据框。作为一个例子考虑

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 &lt;- V3V3 &lt;- V1 导致

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

我尝试了一个 do 循环,但它需要很长时间。如果我使用 Perl,则需要几秒钟。我相信这项任务也可以在 R 中有效地完成。任何建议表示赞赏。

【问题讨论】:

  • 我很好奇这种情况是怎么出现的,如果你不介意我问的话。我有一些使用至少设计用于处理调查数据的软件的经验,但是随着我们跟随与 IT 数据库集成的趋势,数据结构的问题已经开始出现,我需要开始有意识地思考如何我们将东西存储在表格中。这就是为什么我很好奇你的情况是如何出现的:)

标签: r dataframe


【解决方案1】:

试试这个

 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

【讨论】:

    【解决方案2】:

    您可以使用transform 来执行此操作。

    df <- transform(df, V3 = ifelse(V2 == 'b', V1, V3), V1 = ifelse(V2 == 'b', V3, V1))
    

    【讨论】:

    • 我正在尝试 x=read.table("1.txt") x x[[ 2]], x[[2]], x[[1]]), x[[2]] x[[2]], x[[1]], x[[2]])) 但没有成功!
    【解决方案3】:

    已编辑 我被列名弄糊涂了,抱歉。这行得通。

    如果您不介意行以不同的顺序结束,这是一种“可爱”的方式:

    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

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2019-02-28
      • 2017-06-17
      相关资源
      最近更新 更多