Hello其他程序员。
我有一个包含以下变量的数据集:ID,Date和Firm_name。问题在于虽然ID值是唯一的并且对于公司来说是相同的,但它们往往会随着时间的推移而改变其名称。
我想要做的是确保每家公司(使用他们的ID识别)只有一个名字。最好是来自最新数据值的名称(按日期),但这不是必须的。
我对R的经验仅限于执行简单的任务,而不是像这样编辑数据,所以我很茫然。根据我使用Stata的经验,我认为我可以使用超前/滞后并使用if-conditionals编写一个for循环,但是我无法使其工作。
有任何帮助吗?如果不清楚,请告诉我。
这就是我所拥有的:
ID Name Date
01 Alpha 4/12
01 Alpha 5/12
01 Beta 6/12
01 Beta 7/12
02 Cola 6/14
02 Cola 7/14
03 Pepsi 3/10
03 Pepsi 4/10
这就是我想要的:
ID Name Date
01 Beta 4/12
01 Beta 5/12
01 Beta 6/12
01 Beta 7/12
02 Cola 6/14
02 Cola 7/14
03 Pepsi 3/10
03 Pepsi 4/10
如您所见,现在使用所有行的相同名称描述一家公司(由ID标识)。如上所述,我更喜欢使用的名称是具有最新日期的名称,但这不是绝对必要的。
答案 0 :(得分:2)
这是怎么回事?它使用最新日期的Firm_name
向现有数据框添加一列:
library(dplyr)
(dt <- data.frame(
ID = rep(1:5, 2),
Date = seq(from = as.Date("2016-01-01"), to = as.Date("2016-01-10"), by = 1),
Firm_name = letters[1:10]))
ID Date Firm_name
1 1 2016-01-01 a
2 2 2016-01-02 b
3 3 2016-01-03 c
4 4 2016-01-04 d
5 5 2016-01-05 e
6 1 2016-01-06 f
7 2 2016-01-07 g
8 3 2016-01-08 h
9 4 2016-01-09 i
10 5 2016-01-10 j
_
dt <- group_by(dt, ID)
key <- filter(dt, Date == max(Date))
key <- select(key, -Date)
left_join(dt, key, by = "ID")
ID Date Firm_name.x Firm_name.y
<int> <date> <fctr> <fctr>
1 1 2016-01-01 a f
2 2 2016-01-02 b g
3 3 2016-01-03 c h
4 4 2016-01-04 d i
5 5 2016-01-05 e j
6 1 2016-01-06 f f
7 2 2016-01-07 g g
8 3 2016-01-08 h h
9 4 2016-01-09 i i
10 5 2016-01-10 j j
答案 1 :(得分:1)
使用您的样本数据
dd <- read_table("ID Name Date
01 Alpha 4/12
01 Alpha 5/12
01 Beta 6/12
01 Beta 7/12
02 Cola 6/14
02 Cola 7/14
03 Pepsi 3/10
03 Pepsi 4/10")
如果您认为它已按日期排序,那么您只需使用姓氏替换所有名称
library(dplyr)
dd %>%
group_by(ID) %>%
mutate(Name=last(Name))
# ID Name Date
# <chr> <chr> <chr>
# 1 01 Beta 4/12
# 2 01 Beta 5/12
# 3 01 Beta 6/12
# 4 01 Beta 7/12
# 5 02 Cola 6/14
# 6 02 Cola 7/14
# 7 03 Pepsi 3/10
# 8 03 Pepsi 4/10
如果您需要按日期排序,可以添加arrange()
,但在示例中您没有正确的日期值。
答案 2 :(得分:0)
希望这有帮助!
library(dplyr)
#convert Date column to 'Date' type column
df$Date <- as.Date(paste0(df$Date,"/2017"),format = "%m/%d/%Y")
df %>%
arrange(ID, desc(Date)) %>%
group_by(ID) %>%
#This will filter the latest Name for an "ID"
filter(row_number()==1) %>%
select(ID, Name) %>%
#below join will update the Name in original data
right_join(df,"ID") %>%
select(ID,Date,Name.x) %>%
`colnames<-`(c("ID","Date","Name")) %>%
mutate(Date=format(Date,"%m/%d"))
输出是:
ID Date Name
<int> <chr> <chr>
1 1 04/12 Beta
2 1 05/12 Beta
3 1 06/12 Beta
4 1 07/12 Beta
5 2 06/14 Cola
6 2 07/14 Cola
7 3 03/10 Pepsi
8 3 04/10 Pepsi
#sample data
> dput(df)
structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L), Name = c("Alpha",
"Alpha", "Beta", "Beta", "Cola", "Cola", "Pepsi", "Pepsi"), Date = c("4/12",
"5/12", "6/12", "7/12", "6/14", "7/14", "3/10", "4/10")), .Names = c("ID",
"Name", "Date"), class = "data.frame", row.names = c(NA, -8L))