【问题标题】:if id is same calculate the matrix, esle write 0 in r [duplicate]如果 id 相同,计算矩阵,esle 在 r 中写入 0 [重复]
【发布时间】:2017-11-12 13:30:57
【问题描述】:

如果 ID 相同,我想在新行中输入带有 Locate 列的计算值。 如果ID不相同,我想将其表示为0。

我尝试使用 for 语句,但我工作很辛苦。

帮帮我!!请。谢谢你

这是我的数据,也是我想要做的。

>ID Locate
>10 2333
>10 5555
>10 2330
>10 1355
>12 1332
>12 1233
>12 1112
>13 3213
>14 3222
>14 5123
>14 6321

我想要的是

>ID Locate  diff
>10 2333    0
>10 5555    3222
>10 2330    -3225
>10 1355    -975
>12 1332    0
>12 1233    -99
>12 1112    -121
>13 3213    0
>14 3222    0
>14 5123    1901
>14 6321    1198

这是我的代码....

rm <- c()
for ( i in 1:ncol(test))
  {for ( j in 1:nrow(test))
   {if(test[i,1]==test[i,2])
          {c(test[i,j]-test[i,j+1])}
         else
           0
    rm <- c(rm,i)}}

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    您可以使用diff 执行此操作。在这里,我使用 diff 来计算差异并确定哪些 ID 匹配。

    myData$diff = 0
    myData$diff[which(diff(myData$ID) == 0) + 1] = 
        diff(myData$Locate)[which(diff(myData$ID) == 0)]
    myData
       ID Locate  diff
    1  10   2333     0
    2  10   5555  3222
    3  10   2330 -3225
    4  10   1355  -975
    5  12   1332     0
    6  12   1233   -99
    7  12   1112  -121
    8  13   3213     0
    9  14   3222     0
    10 14   5123  1901
    11 14   6321  1198
    

    数据:

    myData = read.table(text="ID Locate
    10 2333
    10 5555
    10 2330
    10 1355
    12 1332
    12 1233
    12 1112
    13 3213
    14 3222
    14 5123
    14 6321",
    header=TRUE)
    

    【讨论】:

      【解决方案2】:

      如果您的数据是 R 数据框,您可以使用流行的 tidyverse 包组来简化此类工作。

      df %>%
          group_by(ID) %>%
          mutate(diff = Locate - lag(Locate))
      

      这段代码导致

      ID  Locate  diff
      10  2333    NA
      10  5555    3222
      10  2330    -3225
      10  1355    -975
      12  1332    NA
      12  1233    -99
      12  1112    -121
      13  3213    NA
      14  3222    NA
      14  5123    1901
      14  6321    1198
      

      如果你真的需要0 而不是NA,那么你就去做

      df %>%
          group_by(ID) %>%
          mutate(diff = Locate - lag(Locate)) %>%
          mutate(diff = ifelse(is.na(diff), 0, diff))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 2013-12-30
        • 2021-10-26
        • 1970-01-01
        • 2017-12-29
        相关资源
        最近更新 更多