我有一個長檔案,每一行都有觀察結果。以下是變數:
- id = 每個唯一 ID 代表一個人,每個人有 3 個觀察值。
- type = 每個觀察都被編碼為由代碼表示的型別 (207, 208, 212, 359)
- 日期 = 每個觀察都發生在某個日期
- order_num = 這表示觀察發生的順序。
我想使用回圈來創建一個新變數,當 order_num == 1 在每個人的每個觀察中時放置型別。
這是我所擁有的:
# A tibble: 9 x 4
id type date order_num
<dbl> <dbl> <chr> <dbl>
1 1 212 2020-12-15 1
2 1 207 2021-01-21 2
3 1 208 2021-02-21 3
4 2 207 2020-12-31 1
5 2 208 2021-01-30 2
6 2 212 2021-02-28 3
7 3 208 2021-04-01 1
8 3 212 2021-05-01 2
9 3 359 2021-06-01 3
這是我想要的:
id type date order_num first
<dbl> <dbl> <chr> <dbl> <dbl>
1 1 212 2020-12-15 1 212
2 1 207 2021-01-21 2 212
3 1 208 2021-02-21 3 212
4 2 207 2020-12-31 1 207
5 2 208 2021-01-30 2 207
6 2 212 2021-02-28 3 207
7 3 208 2021-04-01 1 208
8 3 212 2021-05-01 2 208
9 3 359 2021-06-01 3 208
正如您在 id 1 中看到的那樣,它們在序列中收到的第一個型別是 212。“第一個”變數現在在 id 1 的所有三個觀察中都具有型別 212。
以下是我開始的資料:
~id,~type,~date, ~order_num,
#---|----|------------|-----------|
1, 212, "2020-12-15", 1,
1, 207, "2021-01-21", 2,
1, 208, "2021-02-21", 3,
2, 207, "2020-12-31", 1,
2, 208, "2021-01-30", 2,
2, 212, "2021-02-28", 3,
3, 208, "2021-04-01", 1,
3, 212, "2021-05-01", 2,
3, 359, "2021-06-01", 3)
不幸的是,當我運行我開發的回圈(見下文)時,我無法得到我正在尋找的結果(見下文)。
我的代碼:
if(df$id[i] == df$id[i-1]){
df$first <- df$type[i-1]
} else if (df$id[i] != df$id[i-1]) {
df$first <- df$type[i]
} else df$first <- 99
}
由我的代碼生成:
# A tibble: 9 x 5
id type date order_num first
<dbl> <dbl> <chr> <dbl> <dbl>
1 1 212 2020-12-15 1 212
2 1 207 2021-01-21 2 212
3 1 208 2021-02-21 3 212
4 2 207 2020-12-31 1 212
5 2 208 2021-01-30 2 212
6 2 212 2021-02-28 3 212
7 3 208 2021-04-01 1 212
8 3 212 2021-05-01 2 212
9 3 359 2021-06-01 3 212
我知道很多事情是錯誤的,因為每個觀察都分配了相同的型別。
有沒有人對我如何獲得我正在尋找的結果有任何建議?
謝謝。
uj5u.com熱心網友回復:
這是在較小的資料集上的解決方案:
library(dplyr) "collector")), `02:30` = structure(list(), class = c("collector_double",
df <- data_frame(id = c(1,1,2,2,3,3),
type = c(212,207,207,208,208,305),
order_num = c(1,2,1,2,1,2))
df <- df %>% group_by(id) %>% mutate(first= type[order_num==1])
uj5u.com熱心網友回復:
您最終在first列中使用所有相同數字的原因是因為您忘記索引行號。這是您的代碼的修復:
for(i in 2:nrow(df)){ #start at index 2 because we are comparing backwards 1 each time
if(df$id[i] == df$id[i-1]){
df$first[i] <- df$type[i-1] #this assumes order_num is always in order; be careful
} else if (df$id[i] != df$id[i-1]) {
df$first[i] <- df$type[i]
} else df$first[i] <- 99
}
此解決方案可能適合您。其他人建議使用 dplyr 作為替代方案。為了避免不必要的外部包,我建議使用baseR的以下解決方案:
id_list <- unique(df$id)
for(i in 1:length(id_list)){
df[df$id == id_list[i], "first"] <- df[df$id == id_list[i] & df$order_num == 1, "type"]
}
編輯:我只是想到了一個僅使用baseR 的更簡單的解決方案:
for(i in 1:nrow(df)){
df[i, "first"] <- df[df$id == df$id[i] & df$order_num == 1, "type"]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333104.html
下一篇:根據R中的其他兩列添加一列值
