我使用以下代码绘制了融化的数据框(为了清楚起见,仅显示了最小片段):
\nggplot(df_melt, aes(x = Date, y= value)) +\n geom_line(aes(color = Variable, size = Variable)) +\n scale_color_manual(values = c("dark green", "azure3", "goldenrod4")) +\n scale_size_manual(values = c(.6, .8, .6)) +\n .\n .\n .\nRun Code Online (Sandbox Code Playgroud)\n但收到以下错误消息:
\nWarning message:\nUsing `size` aesthetic for lines was deprecated in ggplot2 3.4.0.\n\xe2\x84\xb9 Please use `linewidth` instead.\nThis warning is displayed once every 8 hours.\nCall `lifecycle::last_lifecycle_warnings()` to see where this warning was generated. \nRun Code Online (Sandbox Code Playgroud)\n但如果我size = Variable改为linewidth = Variable,我会收到不同的警告:
Warning messages:\n1: Using …Run Code Online (Sandbox Code Playgroud) 我有一个 pandas 数据框,我想按簇计算其中值绝对偏差。我假设 pandas 方法mad是中值绝对偏差,但看起来它是平均绝对偏差。我写的代码行是
df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('mad')
Run Code Online (Sandbox Code Playgroud)
我尝试编写自己的一个小函数来计算中值绝对偏差
def myMAD(x):
med = np.median(x)
x = abs(x-med)
MAD = np.median(x)
return MAD
Run Code Online (Sandbox Code Playgroud)
并更改我的代码以读取
df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('myMAD')
Run Code Online (Sandbox Code Playgroud)
不幸的是这不起作用。我收到 AttributeError 'SeriesGroupBy' 对象没有属性 'myMAD'。
如何通过集群计算数据帧中列的中值绝对偏差,并使用转换正确地使用跨行广播的 MAD 创建新列?
提前致谢
托马斯·飞利浦
我的最小例子:
test_df <- data.frame(Year = 1929:2021,
mydata = 1:93)
ggplot(test_df, aes(x = Year, y = mydata )) +
geom_line() +
labs(y = "S&P 500 EPS / Nominal GDP Normalized") +
theme_bw() +
theme(axis.title.x = element_text(size = 18, face = "bold"),
axis.title.y = element_text(size = 18, face = "bold"),
axis.text.x = element_text(size = 14),
axis.text.y = element_text(size = 14)
)
Run Code Online (Sandbox Code Playgroud)
如果运行它,您将看到最后一个 x 轴标签 (2025) 仅部分可见 - 它在右侧被切断。如何使绘图区域稍微小一些,以便最后一个 x 轴标签可见?如果右侧有图例,这不会是问题,但鉴于我没有图例,似乎需要不同的解决方案。
真诚地提前致以非常感谢
托马斯·飞利浦
我在循环内生成一个 ggplot 对象列表,如下所示:
myPlots = list()
for(i in 1:length(maturities)){
myPlots[[i]] <- ggplot(deltaIR.df, aes(sample = deltaIR.df[,i])) +
stat_qq() + stat_qq_line() +
labs(title=maturities[i],
x = "Theoretical (Normal)",
y = "Empirical Distribution")
}
Run Code Online (Sandbox Code Playgroud)
根据数据集的不同,myPlots 中可能有 4 到 10 个图。我现在想将它们分两行打印在一页上,并尝试了各种方法,取得了不同程度的成功。最有前途的方法是
library(ggpubr)
grid.arrange(myPlots[[1]], myPlots[[2]], myPlots[[3]], myPlots[[4]],
myPlots[[5]], myPlots[[6]], myPlots[[7]], myPlots[[8]], nrow = 2)
Run Code Online (Sandbox Code Playgroud)
这显然有效,但需要我枚举所有对象,我不知道会有多少对象。我试图通过写作来简化这一点
ggarrange(myPlots, nrow = 2)
Run Code Online (Sandbox Code Playgroud)
但收到警告信息:
Warning message:
In as_grob.default(plot) : Cannot convert object of class list into a grob.
Run Code Online (Sandbox Code Playgroud)
我做错了什么,我该如何解决?理想情况下,一行简单的代码将打印存储在 myPlots 中的所有图分两行。
提前致谢
托马斯·菲利普斯
我在使用 rowwise() 计算每行中的 NA 数量时遇到问题。我的最小例子:
df <- data.frame(Q1 = c(rep(1, 1), rep(NA, 9)),
Q2 = c(rep(2, 2), rep(NA, 8)),
Q3 = c(rep(3, 3), rep(NA, 7))
)
df
Q1 Q2 Q3
1 1 2 3
2 NA 2 3
3 NA NA 3
4 NA NA NA
5 NA NA NA
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列来计算每行中 NA 的数量。我可以通过写作来做到这一点
df$Count_NA <- rowSums(is.na(df))
df
Q1 Q2 Q3 …Run Code Online (Sandbox Code Playgroud) 最小示例:一个包含 4 列的小数据框和一个保存我要创建的新列名称的变量。如果对超过一定数量的问题的回答超过阈值,则新列为 TRUE,否则为 FALSE
df1 <- data.frame(ID = LETTERS[1:5],
Q1 = sample(0:10, 5, replace=T),
Q2 = sample(0:10, 5, replace=T)
Q3 = sample(0:10, 5, replace=T)
Q4 = sample(0:10, 5, replace=T)
)
Run Code Online (Sandbox Code Playgroud)
这为我提供了对各种问题的回答的数据框:
> df1
ID Q1 Q2 Q3 Q4
1 A 2 4 5 0
2 B 9 6 6 3
3 C 5 5 3 2
4 D 0 5 3 10
5 E 7 5 6 7
Run Code Online (Sandbox Code Playgroud)
我还定义了以下常量:
QUESTIONS <- c("Q1”, “Q2”, “Q3”, “Q4")
MY_NEW_COL <- "New_Col"
THESHOLD1 …Run Code Online (Sandbox Code Playgroud) 我通过从主数据帧中提取一个小数据帧来绘制与单个用户(表示为 s)相关的答案的时间序列,然后使用下面的代码使用 ggplot 进行绘制:
\ndf_s <- df %>% \n filter(UserId == s) %>%\n select(all_of(c("Answer_Date", questions))) %>%\n melt(id.vars = "Answer_Date", variable.name = "Series")\n\nplt <- df_s %>% \n ggplot(aes(Answer_Date, value)) + \n geom_line(aes(color = Series, linetype = Series)) +\n labs(title = paste0(prefix, s),\n x = "Answer_Date", y = "Response")\n\nshow(plt)\nRun Code Online (Sandbox Code Playgroud)\n我总共绘制了 6 条线,每条线都有不同的颜色和不同的线型,ggplot 很好地支持了这一点。
\n如果可能的话,我也想改变线条的粗细,第一条线较粗,后续的线较细。如果线条的粗细从第一行到最后一行稳步下降,我几乎会同样高兴。我试过
\ngeom_line(aes(color = Series, linetype = Series, size = Series))\nRun Code Online (Sandbox Code Playgroud)\n它可以工作,但是线条太粗了,此外,我还收到以下神秘警告:
\nWarning message:\nUsing size for a discrete variable is not advised. \nRun Code Online (Sandbox Code Playgroud)\n … 最简单的例子 - 我收到了 3 个受试者对包含两个问题的调查问卷的 9 个回复:
set.seed(1)
df <- data.frame(ID = c(rep("A", 2), rep("B", 3), rep("C", 4)),
Q1 = sample(0:5, 9, replace=T),
Q2 = sample(1:7, 9, replace=T),
Days_Used = c(rep(10, 2), rep(5, 3), rep(4, 4))
)
Run Code Online (Sandbox Code Playgroud)
将 Days_Used 视为 End_Date - Start_Date。我想以两种方式之一过滤数据框 - 按 Days_Used 或填写调查问卷的次数(即按与主题关联的行数),具体取决于变量是否FILTER_BY_DAYS_USED为TRUE或FALSE。我尝试了以下方法:
FILTER_BY_DAYS_USED <- TRUE
df %>%
group_by(ID) %>%
if_else(FILTER_BY_DAYS_USED,
filter(Days_Used >= 5),
filter(n() >= 3))
Run Code Online (Sandbox Code Playgroud)
但当我执行它时收到错误消息
Error: `condition` must be a logical vector, not a grouped_df/tbl_df/tbl/data.frame` object.
Run Code Online (Sandbox Code Playgroud)
我想获得以下输出: …
我有一个数据框,可以使用计算一个滚动10周期的新列pandas.stats.moments.rolling_mean(ExistingColumn, 10,
min_periods=10).如果可用的时间少于10个,我会得到一个NaN.我可以为滚动中位数做同样的事情.完善.
我现在想要计算N个周期的其他滚动函数,但是在我的生活中不能弄清楚如何使用Pandas的用户定义函数.特别是,我想计算一个滚动的10点Hodges Lehman Mean,其定义如下:
def hodgesLehmanMean(x):
return 0.5 * statistics.median(x[i] + x[j] for i in range(len(x)) for j in range(i+1,len(x)))
Run Code Online (Sandbox Code Playgroud)
如何将其转换为可应用于Pandas数据帧的滚动函数,如果传递少于10个周期,则返回NaN?我是一个熊猫新手,所以我特别感谢一个简单的解释和一个例子.
这是我的代表
library(openxlsx2)
wb <- openxlsx2::wb_workbook()
openxlsx2::wb_add_worksheet(wb, "All Courses")
allLines = c("This is the first test",
"This is the second test",
"This is the third test")
openxlsx2::wb_add_data(wb, sheet = "All Courses", allLines, start_col = 1, start_row = 1)
openxlsx2::wb_save(wb, file = "C:/Temp/My xlsx2 Test.xlsx", overwrite = TRUE)
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我可靠地收到以下错误消息:
openxlsx2::wb_add_data(wb, sheet = "All Courses", allLines, start_col = 1, start_row = 1)
Error in wb$.__enclos_env__$private$get_sheet_index(sheet) :
Sheet name(s) not found: all courses
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这是一个错误还是我做错了什么。在此先感谢您的帮助
托马斯·飞利浦