【问题标题】:Constract DF from a logical DF and a Boolean DF从逻辑 DF 和布尔 DF 构造 DF
【发布时间】:2017-02-26 17:00:48
【问题描述】:

我有两个 DF 以下是布尔值

> Portfolio 1 

Name | X1992 | X1993 | X1994 
XHHD   False   False   True
Jdqd   False   False   False
Jhds   False   True    False
lkaz   False   False   True                      
nqb    True    False   False
jbqs   False   False   False
jbq    False   True    False
knd    True    False   True
njvd   False   True    False
kjiz   True    False   True
khza   False   False   False
akhd   False   False   True
jkaze  True    True    False
bzae   True    False   False

第二个 DF 有一个月的频率

返回

Name | 1992/01 | 1992/02 ..... 1994/12 
XHHD   0.23       0.564
Jdqd   0.3        0.654
Jhds   0.234      0.456
lkaz   0.54       0.472               
nqb    0.99       0.761
jbqs   0.01       1.765
jbq    0.23       0.002
knd    0.59       2.32
njvd   0.123      0.43
kjiz   0.987      -0.12
khza   1.34       0.12
akhd   0.76       0.23
jkaze  0.654      0.98
bzae   0.43       0.73

我想要一个 DF,它可以根据布尔 DF 计算公司的平均每月回报,如果 Companies TRUE 然后将她的回报包括在计算中。 结果将是

Date     Portfolio 1
1992/01   mean
1992/02   mean
1992/03   mean
1992/04   mean

【问题讨论】:

  • 请使用dput 使您的示例可重现。

标签: r dataframe data.table combinations


【解决方案1】:

我们可以通过转换为“长”格式来做到这一点,进行连接,然后通过“日期”获取mean

library(data.table)
dM1 <- melt(setDT(df1), id.var = "Name")
na.omit(melt(setDT(df2), id.var = "Name", variable.name = "Date")[,
     variable := paste0("X", substring(Date, 1, 4))
      ][dM1, on = .(Name, variable)
       ][i.value == "True", .(Portfolio = mean(value, na.rm = TRUE)) , Date])
#     Date  Portfolio  
#1: 1992/01    0.7302
#2: 1992/02    0.9342

数据

 df1 <- structure(list(Name = c("XHHD", "Jdqd", "Jhds", "lkaz", "nqb", 
"jbqs", "jbq", "knd", "njvd", "kjiz", "khza", "akhd", "jkaze", 
"bzae"), X1992 = c("False", "False", "False", "False", "True", 
"False", "False", "True", "False", "True", "False", "False", 
"True", "True"), X1993 = c("False", "False", "True", "False", 
"False", "False", "True", "False", "True", "False", "False", 
"False", "True", "False"), X1994 = c("True", "False", "False", 
"True", "False", "False", "False", "True", "False", "True", "False", 
"True", "False", "False")), .Names = c("Name", "X1992", "X1993", 
"X1994"), class = "data.frame", row.names = c(NA, -14L))

df2 <-  structure(list(Name = c("XHHD", "Jdqd", "Jhds", "lkaz", "nqb", 
"jbqs", "jbq", "knd", "njvd", "kjiz", "khza", "akhd", "jkaze", 
"bzae"), `1992/01` = c(0.23, 0.3, 0.234, 0.54, 0.99, 0.01, 0.23, 
0.59, 0.123, 0.987, 1.34, 0.76, 0.654, 0.43), `1992/02` = c(0.564, 
0.654, 0.456, 0.472, 0.761, 1.765, 0.002, 2.32, 0.43, -0.12, 
0.12, 0.23, 0.98, 0.73)), .Names = c("Name", "1992/01", "1992/02"
), class = "data.frame", row.names = c(NA, -14L))

【讨论】:

  • 感谢 arkun 的回答,但输出中响起了一些声音。如下所示
  • 感谢 arkun 的回答。但是有一个东西响了,导致输出看起来像这样 Names = c("Name", "variable", "value"), row.names = c(NA, -68088L), class= c("data.table" , "data.frame"), .internal.selfref = ) 如果我在 cood 中更改两个 DF 的位置,则会出现 Names = c("Name", "variable", "value" ), row.names = c(NA, -68088L), class= c("data.table", "data.frame"), .internal.selfref = ) 只是我想要 Names =c (“日期”,作品集1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2020-06-20
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多