R 如何使用if语句将整行分隔成新的数据帧
我有一个数据帧R 如何使用if语句将整行分隔成新的数据帧,r,if-statement,R,If Statement,我有一个数据帧df,看起来像这样: Date Company MarketCap 2000-01-31 Company one 1000 2000-02-28 Company one 2000 2000-03-31 Company one 3000 2000-01-31 Company two 2500 2000-02-28 Company two 3000 2000-03-31 Company tw
df
,看起来像这样:
Date Company MarketCap
2000-01-31 Company one 1000
2000-02-28 Company one 2000
2000-03-31 Company one 3000
2000-01-31 Company two 2500
2000-02-28 Company two 3000
2000-03-31 Company two 3500
2000-01-31 Company three 1500
2000-02-28 Company three 1800
2000-03-31 Company three 1100
我需要执行以下操作的if语句:
If(df$MarketCap >= median(df$MarketCap){
BigCap <- df[all the rows that have a market cap >= median(df$MarketCap)
}
我觉得使用if语句应该很容易实现这一点,但到目前为止,我还没有取得任何成功(也不是通过在SO上查看类似的问题)。我感谢所有能得到的帮助
注意,我的实际df比这里提供的示例要大得多,在这里我有360个日期和2000多家公司。我创建了
SmallCap
和LargeCap
,这是一个数据列表。框架包含
或=median(MarketCap)
的观察值。列表中的每个条目都是一个单独的日期
library(dplyr)
SmallCap <- df %>%
group_by(Date) %>%
filter(MarketCap < median(MarketCap)) %>%
split(.$Date)
# $`1`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-01-31 Company_one 1000
# $`2`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-02-28 Company_three 1800
# $`3`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-03-31 Company_three 1100
LargeCap <- df %>%
group_by(Date) %>%
filter(MarketCap >= median(MarketCap)) %>%
split(.$Date)
# $`2000-01-31`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-01-31 Company_two 2500
# 2 2000-01-31 Company_three 1500
# $`2000-02-28`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-02-28 Company_one 2000
# 2 2000-02-28 Company_two 3000
# $`2000-03-31`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-03-31 Company_one 3000
# 2 2000-03-31 Company_two 3500
库(dplyr)
小盘股%
分组单位(日期)%>%
过滤器(MarketCap<中值(MarketCap))%>%
拆分(.$日期)
# $`1`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-01-31公司1 1000
# $`2`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-02-28三连1800
# $`3`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-03-31第三公司1100
大上限%
分组单位(日期)%>%
过滤器(MarketCap>=中值(MarketCap))%>%
拆分(.$日期)
# $`2000-01-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-01-31公司2 2500
#2000年01月31日第三公司1500
# $`2000-02-28`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-02-28 2000年第一公司
#2 2000-02-28公司2 3000
# $`2000-03-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-03-31公司1 3000
#2 2000-03-31公司2 3500
我创建了SmallCap
和LargeCap
,这是一个数据框架列表,其中包含
或=median(MarketCap)
的观察值。列表中的每个条目都是一个单独的日期
library(dplyr)
SmallCap <- df %>%
group_by(Date) %>%
filter(MarketCap < median(MarketCap)) %>%
split(.$Date)
# $`1`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-01-31 Company_one 1000
# $`2`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-02-28 Company_three 1800
# $`3`
# # A tibble: 1 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-03-31 Company_three 1100
LargeCap <- df %>%
group_by(Date) %>%
filter(MarketCap >= median(MarketCap)) %>%
split(.$Date)
# $`2000-01-31`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-01-31 Company_two 2500
# 2 2000-01-31 Company_three 1500
# $`2000-02-28`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-02-28 Company_one 2000
# 2 2000-02-28 Company_two 3000
# $`2000-03-31`
# # A tibble: 2 x 3
# # Groups: Date [1]
# Date Company MarketCap
# <fctr> <fctr> <int>
# 1 2000-03-31 Company_one 3000
# 2 2000-03-31 Company_two 3500
库(dplyr)
小盘股%
分组单位(日期)%>%
过滤器(MarketCap<中值(MarketCap))%>%
拆分(.$日期)
# $`1`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-01-31公司1 1000
# $`2`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-02-28三连1800
# $`3`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-03-31第三公司1100
大上限%
分组单位(日期)%>%
过滤器(MarketCap>=中值(MarketCap))%>%
拆分(.$日期)
# $`2000-01-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-01-31公司2 2500
#2000年01月31日第三公司1500
# $`2000-02-28`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-02-28 2000年第一公司
#2 2000-02-28公司2 3000
# $`2000-03-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#
#1 2000-03-31公司1 3000
#2 2000-03-31公司2 3500
我喜欢CPak的答案,但如果您需要单独的数据.frames
,这可以:
df <- data.frame(date = rep(Sys.Date() - c(60,30,0), 3), comp = rep(1:3, each = 3),
cap = c(1000, 2000, 3000, 2500, 3000, 3500, 1500, 1800, 1100))
for (i in unique(as.character(df$date))) {
med <- median(df$cap[df$date == i])
assign(paste0("smallCap", format(as.Date(i), "%b")),
df[df$date == i & df$cap < med, ])
assign(paste0("bigCap", format(as.Date(i), "%b")),
df[df$date == i & df$cap >= med, ])
}
df我喜欢CPak的答案,但如果您需要单独的数据.frames
,这可以:
df <- data.frame(date = rep(Sys.Date() - c(60,30,0), 3), comp = rep(1:3, each = 3),
cap = c(1000, 2000, 3000, 2500, 3000, 3500, 1500, 1800, 1100))
for (i in unique(as.character(df$date))) {
med <- median(df$cap[df$date == i])
assign(paste0("smallCap", format(as.Date(i), "%b")),
df[df$date == i & df$cap < med, ])
assign(paste0("bigCap", format(as.Date(i), "%b")),
df[df$date == i & df$cap >= med, ])
}
df我会试试你的答案,看看我能不能让它工作。请注意,我现在已经对我的问题进行了一些编辑,为了更容易理解(或者解决)您编辑的问题,现在只需要BigCap=median(df$MarketCap,na.rm=T),]
谢谢,这很有效:)我确信我需要一个if-and/or-for语句。如果,就像我最初的问题一样,我只想在某些日期这样做会怎么样。也就是说,我想对1月份的所有市值做一个大于或等于1月份市值中值的大头寸。有没有一种简单的方法可以在您的解决方案中实现这一点?我试过使用BigCapJan=median(df$MarketCap[stri\u detect\u fixed(df$Date,“2000-01”)],na.rm=T),]
但这似乎不起作用。我会尝试你的答案,看看我是否能让它起作用。请注意,我现在已经对我的问题进行了一些编辑,为了更容易理解(或者解决)您编辑的问题,现在只需要BigCap=median(df$MarketCap,na.rm=T),]
谢谢,这很有效:)我确信我需要一个if-and/or-for语句。如果,就像我最初的问题一样,我只想在某些日期这样做会怎么样。也就是说,我想对1月份的所有市值做一个大于或等于1月份市值中值的大头寸。有没有一种简单的方法可以在您的解决方案中实现这一点?我试过使用BigCapJan=median(df$MarketCap[stri\u detect\u fixed(df$Date,“2000-01”)],na.rm=T),]
但这似乎不起作用。
med <- median(df$cap[format(df$date, "%m") == "10"])
BigCapOct <- df[format(df$date, "%m") == "10" & df$cap >= med, ]