我有以下資料集。
id< -c(1001,/span>1001。 1001,1002, 1002, 1003,1004, 1005, 1005,1005)
年< -c(2010,2013。 2016, 2013,2010。 2010,2016,2016。 2010,2013)
狀態< -c(2,2。 2, 3, 4, 2,1,1。 1,5)
df<-data.frame(id, year, status)
df < -df[order(df$id。 df$year), ]
我的目標是創建一個有兩個索引的for-loop,一個是id,另一個是year,這樣它首先運行id,然后在每個id中查看years,其中status有變化。為了記錄這個回圈的變化,我想用另一個變數來顯示變化發生的時間。
例如,在下面的資料框中,變數change記錄了id 1001在所有三年中的0。但是對于1002來說,在2013年的時候,狀態的變化被記錄為1。對于1005,狀態改變了兩次,在2013年和2016年,這就是為什么1被記錄了兩次。
id year status change
1 1001 2010 2 0
2 1001 2013 2 0
3 1001 2016 2 0
5 1002 2010 4 0
4 1002 2013 3 1
6 1003 2010 2 0
7 1004 2016 1 0
9 1005 2010 1 0
10 1005 2013 2 1
8 1005 2016 1 1
實際的資料框架有超過60萬個觀察值。回圈的運行需要大量的時間。我也愿意接受更快的解決方案。
我的代碼如下:
df$change< -NA df$id<-as. 字符(df$id) for(id in unique(df$id) ) {
tau< -df$year[df$id==id] if (length(tau)> 1) {
for( j in 1。 (length(tau)-1)){
if (df$status[df$year==tau[j]/span> & df$id==id] ! =df$status[df$year==tau[j 1] & df$id==id]) {
df$change[/span>df$year==tau[j] & df$id==id]<-0。
df$change[df$year==tau[j 1] & df$id==id]/span><-1
} else {>
df$change[/span>df$year==tau[j] & df$id==id]<-0。
df$change[df$year==tau[j 1] & df$id==id]<-0
}}}
uj5u.com熱心網友回復:
你可以做到:
基礎R:
df |>
transform(change = ave(status, id, FUN = (X)c(0。 diff(x))! =0))
在tidyverse中:
library(tidyverse)
df %>%。
group_by(id)%>%
mutate(change = c(0。 diff(status)! =0))
ID年狀態變化
<dbl> <dbl> <dbl> <dbl>
1 1001 2010 2 0
2 1001 2013 2 0
3 1001 2016 2 0
4 1002 2010 4 0
5 1002 2013 3 1
6 1003 2010 2 0
7 1004 2016 1 0
8 1005 2010 1 0
9 1005 2013 5 1
10 1005 2016 1 1
uj5u.com熱心網友回復:
這是否產生了正確的結果?
library(dplyr)
id< -c(1001,1001。 1001,1002, 1002, 1003,1004, 1005。 1005,1005)
年< -c(2010,2013。 2016, 2013,2010。 2010,2016,2016。 2010,2013)
狀態< -c(2,2。 2, 3, 4, 2,1,1。 1,5)
df<-data.frame(id, year, status)
df < -df[order(df$id。 df$year), ]/span>
df %>%
group_by(/span>id) %>%
mutate(change = as. numeric(status !=lag(status,)
默認= first(status))>
#> # A tibble: 10 x 4
#> id年狀態變化。
#> <dbl> <dbl> <dbl>
#> 1 1001 2010 2 0
#> 2 1001 2013 2 0
#> 3 1001 2016 2 0
#> 4 1002 2010 4 0
#> 5 1002 2013 3 1
#> 6 1003 2010 2 0
#> 7 1004 2016 1 0
#> 8 1005 2010 1 0
#> 9 1005 2013 5 1
#> 10 1005 2016 1 1
注意:我把 "NA替換 "放在第二個mutate中,因為這一步不需要在分組資料上進行,這樣對大資料集來說就更快了
uj5u.com熱心網友回復:我們可以使用ifelse,在status和lag(status)之間進行邏輯比較。關鍵是引數default = first(status),它消除了輸出中常見的NA問題。
df %>% group_by(id) %>%
mutate(change=ifelse(status==lag(status, 默認= first(status))。 0, 1))
# A tibble: 10 x 4
# Groups: id [5]
id年份狀態變化
<dbl>/span> <dbl> <dbl> <dbl>
1 1001 2010 2 0
2 1001 2013 2 0
3 1001 2016 2 0
4 1002 2010 4 0
5 1002 2013 3 1
6 1003 2010 2 0
7 1004 2016 1 0
8 1005 2010 1 0
9 1005 2013 5 1
10 1005 2016 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/309961.html
標籤:
下一篇:從串列中沒有的內容建立新的字典
