R-如何根据不同列中的值将特定列中的值移动到不同的行

时间:2014-02-21 23:40:34

标签: r dataframe

假设我有以下数据框:

Seconds = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3) 
Markers= c("NA", "NA", "Start", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA") 
df = data.frame(Seconds, Markers)

我想将列标记中“开始”指示的值向下移动其列(或新列)0.5秒的差异。这可能是一个结果:

Seconds = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3) 
Markers2= c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "Seconds", "NA", "NA", "NA", "NA", "NA", "NA") 
df2 = data.frame(Seconds, Markers2)

如果它更容易实现,这将起作用:

Seconds = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3) 
Markers2= c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "Seconds", "NA", "NA", "NA", "NA", "NA", "NA") 
df3 = data.frame(Seconds, Markers, Markers2)

我想也许我可以这样做:

 df$MarkerReal <- NA
 df$MarkerReal [which(df$Markers == 'Start') + 5] <- 'Start'

这适用于此示例,但我正在使用的实际数据是以毫秒为单位的时间敏感数千行。我需要移动它没有指定数量的行,而是将其基于值,在此示例中将其移动半秒。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个选项:

curr.pos <- which(df$Markers == "Start")[[1]]  # taking first "Start" in case you have more than one
new.pos <- with(df, max(which(Seconds <= Seconds[[curr.pos]] + 0.5)))
df$Markers[c(curr.pos, new.pos)] <- c("NA", "Start")

产地:

   Seconds Markers
1      0.0      NA
2      0.1      NA
3      0.2      NA
4      0.3      NA
5      0.4      NA
6      0.5      NA
7      0.6      NA
8      0.7   Start
9      0.8      NA
10     0.9      NA
11     1.0      NA
12     1.1      NA
13     1.2      NA
14     1.3      NA

这当然假设您的DF按Seconds列排序。

作为旁注,您应该考虑使用真实的NA(即NA_character_)而不是具有“NA”值的字符串。