如何在r中的不同列上执行行方式操作

时间:2017-06-30 08:46:17

标签: r

我在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))

上面有更好的方法吗?

5 个答案:

答案 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)))
相关问题