具有特定字符串的数据帧的特定行之间的差异

问题描述 投票:0回答:1

我有一个数据框

df
,我需要创建一个新列
delay
,当列
TIME
等于特定字符串时,在其中计算列
TEXT
的特定行之间的差异: P_S1 - TEXT_W1 之间的区别; P_S2 - TEXT_W2。在这个例子中只有两个不同之处,但在真实数据集中有更多。

请看下面的例子:

|   ID          |   TEXT        |   TIME    |   delay   |
|   P48_1_st    |   TEXT_W1[1]  |   1669    |   NA      |
|   P48_1_st    |   TEXT_W1     |   1669    |   NA      |
|   P48_1_st    |   P_S1        |   1748    |   79      |
|   P48_1_st    |   TEXT_W1[2]  |   2377    |   NA      |
|   P48_1_st    |   TEXT_W2[1]  |   3091    |   NA      |
|   P48_1_st    |   TEXT_W2     |   3093    |   NA      |
|   P48_1_st    |   P_S2        |   3156    |   63      |
|   P48_1_st    |   TEXT_W2[2]  |   3562    |   NA      |
|   P48_1_st    |   TEXT_W2[1]  |   8237    |   NA      |
|   P48_1_st    |   A_P_S2      |   8319    |   NA      |
|   P48_1_st    |   TEXT_W2[5]  |   8379    |   NA      |
|   P48_1_st    |   TEXT_W1[1]  |   8380    |   NA      |
|   P48_1_st    |   A_P_S1      |   8447    |   NA      |
|   P48_1_st    |   TEXT_W1[3]  |   8507    |   NA      |
|   P48_1_st    |   TEXT_W1[1]  |   8700    |   NA      |
|   P48_1_st    |   P_S1[2]     |   8788    |   NA      |
|   P48_1_st    |   TEXT_W1[6]  |   8848    |   NA      |
|   P48_1_st    |   TEXT_W2     |   9144    |   NA      |
|   P48_1_st    |   TEXT_W2     |   9168    |   NA      |
|   P48_1_st    |   TEXT_W2[1]  |   9282    |   NA      |
|   P48_1_st    |   P_S2[2]     |   9343    |   NA      |
|   P48_1_st    |   TEXT_W2[6]  |   9403    |   NA      |
|   P48_1_st    |   TEXT_W2[1]  |   9441    |   NA      |
|   P48_1_st    |   TEXT_W2[4]  |   9441    |   NA      |
|   P48_1_st    |   TEXT_W2[1]  |   9443    |   NA      |
|   P48_1_st    |   P_S2[2]     |   9513    |   NA      |
|   P48_1_st    |   TEXT_W2[6]  |   9573    |   NA      |
|   P48_2_st    |   TEXT_W1[1]  |   6148    |   NA      |
|   P48_2_st    |   TEXT_W1     |   6154    |   NA      |
|   P48_2_st    |   P_S1        |   6234    |   80      |
|   P48_2_st    |   TEXT_W1[2]  |   6689    |   NA      |
|   P48_2_st    |   TEXT_W2[1]  |   6911    |   NA      |
|   P48_2_st    |   TEXT_W2     |   6915    |   NA      |
|   P48_2_st    |   P_S2        |   7002    |   87      |
|   P48_2_st    |   TEXT_W2[2]  |   7210    |   NA      |
|   P48_2_st    |   TEXT_W2[1]  |   10602   |   NA      |
|   P48_2_st    |   A_P_S2      |   10670   |   NA      |
|   P48_2_st    |   TEXT_W2[5]  |   10731   |   NA      |
|   P48_2_st    |   TEXT_W1     |   11250   |   NA      |
|   P48_2_st    |   TEXT_W1     |   11251   |   NA      |
|   P48_2_st    |   TEXT_W1     |   11252   |   NA      |
|   P48_2_st    |   TEXT_W1     |   11252   |   NA      |    
|   P48_2_st    |   TEXT_W1     |   11264   |   NA      |
|   P48_2_st    |   TEXT_W1     |   11265   |   NA      |
|   P48_2_st    |   TEXT_W1[1]  |   11266   |   NA      |
|   P48_2_st    |   A_P_S1      |   11353   |   NA      |
|   P48_2_st    |   TEXT_W1[3]  |   11514   |   NA      |
|   P48_2_st    |   TEXT_W2[1]  |   11775   |   NA      |
|   P48_2_st    |   P_S2[2]     |   11865   |   NA      |
|   P48_2_st    |   TEXT_W2[6]  |   12052   |   NA      |
r dataframe row difference multiple-conditions
1个回答
0
投票

试试

library(dplyr)
library(stringr)
out <- df1 %>%
  mutate(grp = cumsum(lag(str_detect(TEXT, "^P_S\\d+$"), default = TRUE))) %>%
  group_by(ID, grp) %>% 
  mutate(delay2 = (TIME[str_detect(TEXT, "^P_S\\d+$")][1] - 
    TIME[str_detect(TEXT, "^TEXT_W\\d+$")][1]) * 
    NA^str_detect(TEXT, "^P_S\\d+$", negate = TRUE)) %>%
  ungroup %>%
  select(-grp)

-输出

> out$delay
 [1] NA NA 79 NA NA NA 63 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 80 NA NA NA 87 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[50] NA
> out$delay2
 [1] NA NA 79 NA NA NA 63 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 80 NA NA NA 87 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[50] NA

数据

df1 <- structure(list(ID = c("P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", 
"P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", 
"P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", 
"P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", 
"P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_1_st", "P48_2_st", 
"P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", 
"P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", 
"P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st", 
"P48_2_st", "P48_2_st", "P48_2_st", "P48_2_st"), TEXT = c("TEXT_W1[1]", 
"TEXT_W1", "P_S1", "TEXT_W1[2]", "TEXT_W2[1]", "TEXT_W2", "P_S2", 
"TEXT_W2[2]", "TEXT_W2[1]", "A_P_S2", "TEXT_W2[5]", "TEXT_W1[1]", 
"A_P_S1", "TEXT_W1[3]", "TEXT_W1[1]", "P_S1[2]", "TEXT_W1[6]", 
"TEXT_W2", "TEXT_W2", "TEXT_W2[1]", "P_S2[2]", "TEXT_W2[6]", 
"TEXT_W2[1]", "TEXT_W2[4]", "TEXT_W2[1]", "P_S2[2]", "TEXT_W2[6]", 
"TEXT_W1[1]", "TEXT_W1", "P_S1", "TEXT_W1[2]", "TEXT_W2[1]", 
"TEXT_W2", "P_S2", "TEXT_W2[2]", "TEXT_W2[1]", "A_P_S2", "TEXT_W2[5]", 
"TEXT_W1", "TEXT_W1", "TEXT_W1", "TEXT_W1", "TEXT_W1", "TEXT_W1", 
"TEXT_W1[1]", "A_P_S1", "TEXT_W1[3]", "TEXT_W2[1]", "P_S2[2]", 
"TEXT_W2[6]"), TIME = c(1669L, 1669L, 1748L, 2377L, 3091L, 3093L, 
3156L, 3562L, 8237L, 8319L, 8379L, 8380L, 8447L, 8507L, 8700L, 
8788L, 8848L, 9144L, 9168L, 9282L, 9343L, 9403L, 9441L, 9441L, 
9443L, 9513L, 9573L, 6148L, 6154L, 6234L, 6689L, 6911L, 6915L, 
7002L, 7210L, 10602L, 10670L, 10731L, 11250L, 11251L, 11252L, 
11252L, 11264L, 11265L, 11266L, 11353L, 11514L, 11775L, 11865L, 
12052L), delay = c(NA, NA, 79L, NA, NA, NA, 63L, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 80L, NA, NA, NA, 87L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-50L))
© www.soinside.com 2019 - 2024. All rights reserved.