如果id相同则计算矩阵,esle在r中写入0

时间:2017-11-12 13:30:57

标签: r for-loop if-statement

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

我试着用声明,但我努力工作。

帮助我!!请。谢谢

这是我的数据以及我想要做的事情。

>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)}}

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如果您的数据是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))