小编Tho*_*ips的帖子

在 ggplot 中手动缩放线宽的正确语法

我使用以下代码绘制了融化的数据框(为了清楚起见,仅显示了最小片段):

\n
ggplot(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          .\n
Run Code Online (Sandbox Code Playgroud)\n

但收到以下错误消息:

\n
Warning 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. \n
Run Code Online (Sandbox Code Playgroud)\n

但如果我size = Variable改为linewidth = Variable,我会收到不同的警告:

\n
Warning messages:\n1: Using …
Run Code Online (Sandbox Code Playgroud)

r ggplot2

6
推荐指数
1
解决办法
1780
查看次数

在 Pandas `transform()` 中使用自定义函数(中值绝对偏差)

我有一个 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 创建新列?

提前致谢

托马斯·飞利浦

dataframe python-3.x pandas pandas-groupby

5
推荐指数
1
解决办法
5650
查看次数

ggplot x 轴标签超出边界并被部分截断

我的最小例子:

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 轴标签可见?如果右侧有图例,这不会是问题,但鉴于我没有图例,似乎需要不同的解决方案。

真诚地提前致以非常感谢

托马斯·飞利浦

r ggplot2 axis-labels

5
推荐指数
1
解决办法
2226
查看次数

在页面上布置多个 ggplot 图

我在循环内生成一个 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 中的所有图分两行。

提前致谢

托马斯·菲利普斯

r ggplot2 ggpubr

4
推荐指数
1
解决办法
9950
查看次数

使用 rowwise() 计算数据帧每一行中 NA 的数量的问题

我在使用 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)

r dplyr rowwise

4
推荐指数
4
解决办法
138
查看次数

使用 dplyr 和 mutate 计算满足条件的列数

最小示例:一个包含 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)

r dplyr mutate

3
推荐指数
1
解决办法
70
查看次数

在 ggplot geom_line 中创建不同粗细的线

我通过从主数据帧中提取一个小数据帧来绘制与单个用户(表示为 s)相关的答案的时间序列,然后使用下面的代码使用 ggplot 进行绘制:

\n
df_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)\n
Run Code Online (Sandbox Code Playgroud)\n

我总共绘制了 6 条线,每条线都有不同的颜色和不同的线型,ggplot 很好地支持了这一点。

\n

如果可能的话,我也想改变线条的粗细,第一条线较粗,后续的线较细。如果线条的粗细从第一行到最后一行稳步下降,我几乎会同样高兴。我试过

\n
geom_line(aes(color = Series, linetype = Series, size = Series))\n
Run Code Online (Sandbox Code Playgroud)\n

它可以工作,但是线条太粗了,此外,我还收到以下神秘警告:

\n
Warning message:\nUsing size for a discrete variable is not advised. \n
Run Code Online (Sandbox Code Playgroud)\n …

r ggplot2

2
推荐指数
1
解决办法
415
查看次数

使用 if_else 或 case_when 以两种不同的方式有条件地过滤数据帧

最简单的例子 - 我收到了 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_USEDTRUEFALSE。我尝试了以下方法:

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)

我想获得以下输出: …

r case filter dplyr

2
推荐指数
1
解决办法
166
查看次数

Pandas:在数据框中创建一个新列,它是滚动窗口的一个功能

我有一个数据框,可以使用计算一个滚动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?我是一个熊猫新手,所以我特别感谢一个简单的解释和一个例子.

python user-defined-functions dataframe pandas

1
推荐指数
1
解决办法
2136
查看次数

无法使用 openxlsx2 写入工作表

这是我的代表

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)

我无法弄清楚这是一个错误还是我做错了什么。在此先感谢您的帮助

托马斯·飞利浦

r xlsx openxlsx

0
推荐指数
1
解决办法
48
查看次数