簡體   English   中英

R-如何根據不同列中的值將特定列中的值移動到不同行

[英]R- How to move value in a specific column to a different row based on a value in a different column

假設我有以下數據框:

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'

這適用於本示例,但是我正在使用的實際數據對毫秒敏感,具有數千行的時間。 我不需要移動指定數量的行,而是將其基於該值,在此示例中,將其移動了半秒。

有任何想法嗎?

這是一個選項:

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”值的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM