我在r
中有以下数据框var
我想计算count2,count1和count3与count2之间的距离,如下所示
count1 count2 count3
0 12 11
12 13 44
22 32 13
到每一行数据帧。我想要的数据帧如下
sqrt(abs(count2-count1) + abs(count3-count2))
我这样做的方式是使用for循环
count1 count2 count3 distance
0 12 11 sqrt(abs(12-0)+abs(12-11))
12 13 44 sqrt(abs(13-12)+abs(44-13))
22 32 13 sqrt(abs(32-22)+abs(13-32))
上面有更好的方法吗?
答案 0 :(得分:3)
我想dplyr
包是可行的方法:
df <- data.frame(count1 = sample(1:100,10),count2 = sample(1:100,10),count3 = sample(1:100,10))
> df %>% mutate(distance=sqrt(abs(count2-count1) + abs(count3-count2)))
count1 count2 count3 distance
1 79 59 54 5.000000
2 70 18 22 7.483315
3 31 13 57 7.874008
4 54 49 53 3.000000
5 94 67 77 6.082763
6 51 74 21 8.717798
7 33 4 24 7.000000
8 90 79 78 3.464102
9 6 64 98 9.591663
10 22 68 28 9.273618
答案 1 :(得分:1)
df$distance = apply(df, 1,
function(x) sqrt(abs(x[2] - x[1]) + abs(x[3] - x[2])))
df
答案 2 :(得分:1)
我们可以使用base R
df$distance <- with(df, sqrt(abs(count2 - count1) + abs(count3 - count2)))
或rowSums
base R
df$distance <- sqrt(rowSums(abs(df[-1] - df[-length(df)])))
df <- structure(list(count1 = c(0L, 12L, 22L), count2 = c(12L, 13L,
32L), count3 = c(11L, 44L, 13L)), .Names = c("count1", "count2",
"count3"), class = "data.frame", row.names = c(NA, -3L))
答案 3 :(得分:0)
您也可以使用data.table
包:
library(data.table)
y <- data.table(count1 = c(0,12,22), count2 = c(12,13,32), count3 = c(11,44,13))
y[, distance := sqrt(abs(count2 - count1) + abs(count3 - count2))]
结果:
> y
count1 count2 count3 distance
1: 0 12 11 3.605551
2: 12 13 44 5.656854
3: 22 32 13 5.385165
答案 4 :(得分:0)
使用dplyr包
现在几乎就是标准
这是一个使用iris数据的工作示例(使用dput(namedataset)来共享你的数据库)
library(dplyr)
iris[1:3] %>% mutate(res=sqrt(abs(Sepal.Length-Sepal.Width)))