创建一个新列,将第一行留空?

时间:2015-03-20 03:46:57

标签: r

我的data.frame Analysis的结构如下,其中XY指的是IDTime期间的坐标{ {1}}

X <- c(10.32,10.97,11.27)
Y <- c(32.57,33.54,33.98)
Time <- c(1,2,1)
ID <- c("Rod", "Rod", "Greg")

我希望知道每个ID覆盖Time或行的距离。我的data.frame是321300 obs。 3个变量,所以我在Analysis的所有行之后进行迭代。我使用以下来计算距离:

out <- sapply(1:(nrow(Analysis)-1), function(i) {
  d <- dist(Analysis[i:(i+1),1:2])
})

然后,我希望使用以下代码将out添加到Analysis

Analysis$Distance <- out

我希望将Analysis$Distance的第一行留空(因为有NA距离),但我不确定如何1.完成和2.添加到我的原始代码中?

2 个答案:

答案 0 :(得分:0)

就像连接c(NA, out)

一样简单
Analysis$Distance <- c(NA, out)

因为您的数据帧有R = 321300行,因此out将有(R-1)行。 这通常是我们对diff()等返回(R-1)行的函数所做的事情。

(比创建新列更快,因为所有NA:Analysis$Distance <- NA然后单独计算每一行的距离)

答案 1 :(得分:0)

如果我正确地理解了这个问题,我们想要计算每个时间段(而不是跨主题ID)的每个主题id所经过的距离,因此,问题不仅仅是在前面插入NA而是还有关于修复代码以正确计算距离。

library(dplyr)

Analysis <- data.frame(
      X = c(10.32,10.97,11.27),
      Y = c(32.57,33.54,33.98),
      Time = c(1,2,1),
      ID = c("Rod", "Rod", "Greg"))

Analysis %>% 
  arrange(ID,Time) %>%
  group_by(ID) %>%
  mutate( lagX = lag(X), lagY = lag(Y)) %>%
  rowwise() %>%
  mutate(Distance = 
    dist( matrix( c(X,Y,lagX,lagY),nrow=2,byrow=TRUE) ) 
  ) %>%
  select(-lagX, -lagY)

这会产生以下结果:

      X     Y Time   ID Distance
1 11.27 33.98    1 Greg       NA
2 10.32 32.57    1  Rod       NA
3 10.97 33.54    2  Rod 1.167647

换句话说,格雷格根本没有去过。 Rod从1时刻到2时已经移动了1.167647。

(如果我误解了这个问题,我道歉 - 我在这里很新!)