R:使用取决于条件

时间:2018-01-16 17:57:36

标签: r dataframe

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标识)。如上所述,我更喜欢使用的名称是具有最新日期的名称,但这不是绝对必要的。

3 个答案:

答案 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

答案基于:Dplyr: filter last entry for date in a series

答案 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))