【问题标题】:Replacing cells in a data frame替换数据框中的单元格
【发布时间】:2021-02-11 18:15:39
【问题描述】:

假设我有这样一个数据框,其中包含 X, Y, Z, T 列和超过 100 行:

order X Y Z T
 i    a k b n
 j    c a b n

如您所见,如果i-th Xj-th Y 具有相同的值(即a),那么i-th Zj-th Z 具有相同的值(b)和i-th T 和@987654330 @ 具有相同的值 (n)

我想做的是,如果i-th Xj-th Y具有相同的值(即a),那么i-th Z = bj-th Z = ni-th T = nj-th T = b

order  X Y Z T
   i   a k b n
   j   c a n b

我曾尝试在 R 中使用 if elsefor 循环来执行此操作,但我做不到。

谁能帮我在 R 中做到这一点?

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    可以通过case_when完成

    library(dplyr)
    df1 <- df1 %>% 
       mutate(Z = case_when(lag(X) == Y~ T, TRUE ~ Z),
              T = case_when(lag(X) == Y ~ lag(Z), TRUE ~ T))
    

    -输出

    df1
    #  order X Y Z T
    #1     i a k b n
    #2     j c a n b
    

    数据

    df1 <- structure(list(order = c("i", "j"), X = c("a", "c"), Y = c("k", 
    "a"), Z = c("b", "b"), T = c("n", "n")), class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

    • 谢谢@akrun。它可以工作,但是当我使用df1$Zdf1$T 时,它会产生以前的值:b bn n ,而不是替换的值。我做错了什么?
    • @Günal 你需要分配 (df1 &lt;- df1 %&gt;%...) 来修改原始对象
    • 完成。谢谢一百万。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2020-11-12
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多