我在 R 中有一個如下所示的資料集:
name = c("john", "john", "john", "alex", "alex", "peter", "peter", "peter", "peter")
year = c(2010, 2011, 2015, 2014, 2016, 2010, 2011, 2012, 2013)
age = c(21, 21, 21, 55, 55, 61, 61, 61, 61)
problem_data = data.frame(name, year, age)
name year age
1 john 2010 21
2 john 2011 21
3 john 2015 21
4 alex 2014 55
5 alex 2016 55
6 peter 2010 61
7 peter 2011 61
8 peter 2012 61
9 peter 2013 61
在這個資料集中,每個人在最后記錄年份的年齡被錯誤地插入到每一行。例如 - 實際上:
- 2013 年,彼得 61 歲
- 2012 年,彼得 60 歲
- 2011 年,彼得 59 歲
- 2010 年,彼得 58 歲
有時會丟失年份 - 結果是:
- 亞歷克斯 2016 年 55 歲
- 2014 年,亞歷克斯 53 歲
我正在嘗試在 R 中研究一種可以處理此類任務的方法。我一直在嘗試將“累積組差異”和“最大行條件”結合起來——但我不確定如何將這些概念結合在一起來實作這一點:
# https://stackoverflow.com/questions/39237345/subtract-value-in-previous-row-for-each-section-of-a-data-frame-that-corresponds
library(dplyr)
new_data = problem_data %>%
group_by(name) %>%
mutate(real_age= age - lag(age, default = age[1]))
Bur這種做法讓大家的年齡都變成0了!
# A tibble: 9 x 4
# Groups: name [3]
name year age real_age
<chr> <dbl> <dbl> <dbl>
1 john 2010 21 0
2 john 2011 21 0
3 john 2015 21 0
4 alex 2014 55 0
5 alex 2016 55 0
6 peter 2010 61 0
7 peter 2011 61 0
8 peter 2012 61 0
9 peter 2013 61 0
有人可以告訴我如何解決這個問題嗎?
謝謝!
uj5u.com熱心網友回復:
按'name'分組,complete用于獲取缺失的'year', 'year','age'中fill的NA元素之前的非NA值,從組索引的序列中減去'age'
library(dplyr)
library(tidyr)
problem_data %>%
group_by(name) %>%
complete(year = full_seq(year, period = 1)) %>%
fill(year, age, .direction = "downup") %>%
mutate(real_age= age - (row_number() - 1)) %>%
ungroup
uj5u.com熱心網友回復:
你需要這個:
library(dplyr)
library(tidyr)
problem_data %>%
group_by(name) %>%
complete(., year = first(year):last(year), fill = list(freq = 0)) %>%
arrange(-year, .by_group = TRUE) %>%
mutate(real_age = ifelse(row_number()>1, last(age)-row_number() 1, last(age))) %>%
drop_na() # optional
name year age real_age
<chr> <dbl> <dbl> <dbl>
1 alex 2016 55 55
2 alex 2014 55 53
3 john 2015 21 21
4 john 2011 21 17
5 john 2010 21 16
6 peter 2013 61 61
7 peter 2012 61 60
8 peter 2011 61 59
9 peter 2010 61 58
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/529901.html
標籤:rdplyr数据操作
