如果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)}}
答案 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))