簡體   English   中英

R 根據其他列中的值范圍改變新列

[英]R mutate new column based on range of values in other column

我有以下格式的 r dataframe

+--------+---------------+--------------------+--------+
| time   | Stress_ratio  | shear_displacement |   CX   |
+--------+---------------+--------------------+--------+
| <dbl>  |    <dbl>      |    <dbl>           | <dbl>  | 
| 50.1   |    -0.224     |    4.9             |  0     | 
| 50.2   |    -0.219     |    4.98            | 0.0100 | 
| .      | .             | .                  | .      |
| .      | .             | .                  | .      | 
| 249.3  |    -0.217     | 4.97               | 0.0200 |  
| 250.4  |    -0.214     | 4.96               | 0.0300 | 
| 251.1  | -0.222        | 4.91               | 0.06   | 
| 252.1  | -0.222        | 4.91               | 0.06   | 
| 253.3  | -0.222        | 4.91               | 0.06   | 
| 254.5  | -0.222        | 4.91               | 0.06   | 
| 256.8  | -0.222        | 4.91               | 0.06   | 
| .      | .             | .                  | .      | 
| .      | .             | .                  | .      |
| 500.1  | -0.22         | 4.91               | 0.6    |    
| 501.4  | -0.22         | 4.91               | 0.6    | 
| 503.1  | -0.22         | 4.91               | 0.6    | 
+--------+---------------+--------------------+--------+

我想要一個新列,它具有基於列時間中一系列值之間的差異的重復值。 列時間的范圍應為 250。 例如,在new_column的所有行中,當df$time[1]df$time[1]*4.98為 250 時,我應該得到數字 1。類似地,當下一個塊開始時相差 250 時,這個數字 1 應該變為 2。所以新的 dataframe 應該是這樣的

+--------+---------------+--------------------+--------+------------+
| time   | Stress_ratio  | shear_displacement |   CX   | new_column |
+--------+---------------+--------------------+--------+------------+
| <dbl>  |    <dbl>      |    <dbl>           | <dbl>  | <dbl>      |
| 50.1   |    -0.224     |    4.9             |  0     | 1          |
| 50.2   |    -0.219     |    4.98            | 0.0100 | 1          |
| .      | .             | .                  | .      | 1          |
| .      | .             | .                  | .      | 1          |
| 249.3  |    -0.217     | 4.97               | 0.0200 | 1          |
| 250.4  |    -0.214     | 4.96               | 0.0300 | 2          |
| 251.1  | -0.222        | 4.91               | 0.06   | 2          |
| 252.1  | -0.222        | 4.91               | 0.06   | 2          |
| 253.3  | -0.222        | 4.91               | 0.06   | 2          |
| 254.5  | -0.222        | 4.91               | 0.06   | 2          |
| 256.8  | -0.222        | 4.91               | 0.06   | 2          |
| .      | .             | .                  | .      | .          |
| .      | .             | .                  | .      | .          |
| 499.1  | -0.22         | 4.91               | 0.6    | 2          |
| 501.4  | -0.22         | 4.91               | 0.6    | 3          |
| 503.1  | -0.22         | 4.91               | 0.6    | 3          |
+--------+---------------+--------------------+--------+------------+

如果我明白你想做什么,一個base的 R 解決方案可能是:

df$new_column <- df$time %/% 250 + 1

%/%運算符是 integer 除法(模數運算符的補碼)並告訴您 250 的副本有多少適合您的數字; 我們加 1 以獲得您想要的值。

tidyverse版本:

df <- df %>%
  mutate(new_column = time %/% 250 + 1)
library(data.table)
setDT(df)[, new_column := rleid(time %/% 250)][]

暫無
暫無

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

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