小编Jer*_* K.的帖子

使用 mutate_all 创建新列

我有一些看起来像这样的数据:

  Year Revenue Cost Rent
1 2016    3000    4  100
2 2017    4000    5  100
3 2018    5000    6  100

df <- data.frame(stringsAsFactors=FALSE,
        Year = c(2016L, 2017L, 2018L),
     Revenue = c(3000L, 4000L, 5000L),
        Cost = c(4L, 5L, 6L),
        Rent = c(100L, 100L, 100L)
)
Run Code Online (Sandbox Code Playgroud)

我想将所有内容分成以下百分比Rent

library(dplyr)
df <- df %>% mutate_at(vars(Revenue:Rent), funs(. /Rent))
Run Code Online (Sandbox Code Playgroud)

这完美地工作。

  Year Revenue Cost Rent
1 2016      30 0.04    1
2 2017      40 0.05    1
3 2018      50 0.06    1
Run Code Online (Sandbox Code Playgroud)

唯一的事情:我丢失了我原来的专栏。

我该如何做mutate_all, 以便我有新的列,比如说叫做 …

r dplyr mutate

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

将各因子水平输出为观星汇总统计表中的虚拟变量

我正在使用 R 包stargazer创建高质量的回归表,我想用它来创建汇总统计表。我的数据中有一个因子变量,我希望汇总表显示因子在每个类别中的百分比——实际上,将因子分成一组互斥的逻辑(虚拟)变量,然后显示表中的那些。下面是一个例子:

> library(car)
> library(stargazer)
> data(Blackmore)
> stargazer(Blackmore[, c("age", "exercise", "group")], type = "text")

==========================================
Statistic  N   Mean  St. Dev.  Min   Max  
------------------------------------------
age       945 11.442  2.766   8.000 17.920
exercise  945 2.531   3.495   0.000 29.960
------------------------------------------
Run Code Online (Sandbox Code Playgroud)

但我试图获得一个额外的行,显示每组中的百分比(在这些数据中,% 控制和/或 % 患者)。我确定这只是观星者某个地方的一个选项,但我找不到它。有谁知道它是什么?

编辑:car::Blackmoor已将拼写更新为car::Blackmore.

regression r stargazer

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

rename_if() 和 starts_with() 为某些列添加前缀

我的数据如下所示:

#>           Artist          Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971
Run Code Online (Sandbox Code Playgroud)

我的问题应该很简单。我试图只使用rename_if以字母“A”开头的列作为前缀。所以我想要的输出是:

#>       df1_Artist      df1_Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971
Run Code Online (Sandbox Code Playgroud)

您可以看到不应以“年份”为前缀。

这是我的尝试,但效果不佳。我使用starts_with不正确吗?我应该试着把它分成两行,这样我才能更清楚地理解它吗?我还在学习 purrr 风格的函数,所以它对我来说并不总是很直观。

df1 %>% rename_if(starts_with("A"), .funs = ~ paste0(df1, .))
#> Error in df1 %>% rename_if(starts_with("A"), .funs = ~paste0(df1, .)): could not find function "%>%"
Run Code Online (Sandbox Code Playgroud)

数据输入代码:

df1 <- data.frame(stringsAsFactors=FALSE,
      Artist = c("Beatles", "Rolling Stones"),
       Album = c("Sgt. Pepper's", …
Run Code Online (Sandbox Code Playgroud)

r rename dplyr purrr tidyverse

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

仅将“ mutate_at”和“ na_if”一起用NA替换零

我的数据采用以下格式:

library(tidyverse)
df <- mtcars
df <- df %>% mutate(vs_doubled = vs * 2) %>% select(mpg, cyl, vs, am, vs_doubled)

head(df)


#>    mpg cyl vs am vs_doubled
#> 1 21.0   6  0  1          0
#> 2 21.0   6  0  1          0
#> 3 22.8   4  1  1          2
#> 4 21.4   6  1  0          2
#> 5 18.7   8  0  0          0
#> 6 18.1   6  1  0          2
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用0 mutate_at并将na_if其设置为NA,但仅用于特定列(“ vs”和“ am”)。我想在列“ vs_doubled”中保留零。

我不太正确,因为以下行不起作用:

df <- …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyverse mutate

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

使用 `purrr:map()` 读取目录中的所有 csv 文件

我想使用读取目录中的所有 *.csv 文件purrr::map,我只是想问是否有比我正在做的更好的方法,特别是如果它来自 tidyverse 或更容易阅读。

特别是,你会使用file.path()? 有没有更简单的方法,或者更容易阅读的方法?

图书馆(tidyverse)

csv_filenames <- list.files(path = "raw_data/")
dfs <- map(csv_filenames, ~read_csv(file.path("raw_data/", .)))
df <- 绑定行(dfs)

r purrr tidyverse

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

lapply 用许多因变量进行估计,然后用 Stargazer 制表

我正在尝试:(1) 估计多个模型,其中只有因变量发生变化 (2) 使用 Stargazer 包将结果制表

以下代码有效,但我必须为每个模型重复一行代码:

    library(stargazer)
    data(mtcars)

    reg1 <- lm(mpg ~ am + gear + carb, data=mtcars)
    reg2 <- lm(cyl ~ am + gear + carb, data=mtcars)
    reg3 <- lm(disp ~ am + gear + carb, data=mtcars)

    stargazer(reg1, reg2, reg3,
              title="Regression Results", type="text", 
              df=FALSE, digits=3)
Run Code Online (Sandbox Code Playgroud)

您可以看到(修剪后的)输出具有正确的因变量标题(mpg、cyl、disp)

Regression Results
==================================================
                         Dependent variable:      
                    ------------------------------
                       mpg       cyl       disp   
                       (1)       (2)       (3)    
--------------------------------------------------
am                   3.545*    -0.176    -40.223  
                     (1.897)   (0.615)   (48.081) 
Run Code Online (Sandbox Code Playgroud)

如果我使用 lapply 和 paste,它最终会改变 stargazer 中因变量的标题:

dependents <- c('mpg', 'cyl', …
Run Code Online (Sandbox Code Playgroud)

r paste lapply stargazer

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

使用dplyr mutate根据列名向量创建新列

我想获取一些列的日志,并创建所有名为log [原始列名]的新列.

下面的代码有效,但是如何将调用的columnstolog变量传递给mutate?谢谢.

library(dplyr)
data(mtcars)

columnstolog <- c('mpg', 'cyl', 'disp', 'hp')

mtcars %>% mutate(logmpg = log(mpg))
mtcars %>% mutate(logcyl = log(cyl))
Run Code Online (Sandbox Code Playgroud)

r dplyr mutate

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

为每个因素水平拟合“lm”模型

我正在尝试编写一个函数,该函数迭代(或使用purrr::map())因子的每个级别,并lm()为因子等于该级别的数据子集拟合模型。

要使用 制作一个简单的可重现示例mtcars,只需说我想要lm为每个值使用不同的模型mtcars$gear。我首先将其作为一个因素,因为我真正的问题涉及通过一个因素进行迭代:

library(tidyverse)

mtcars <- mtcars %>% 
  mutate(factor_gear = factor(gear))
Run Code Online (Sandbox Code Playgroud)

我希望该功能适合各个级别的factor_gear. 级别由下式给出:

levels(mtcars$factor_gear)
Run Code Online (Sandbox Code Playgroud)

IE

  [1] "3" "4" "5"
Run Code Online (Sandbox Code Playgroud)

所以我想要的输出是:

fit1 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="3"))
fit2 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="4"))
fit3 <- lm(mpg ~ cyl, data = mtcars %>% filter(factor_gear=="5"))

fits <- list(fit1, fit2, fit3)
Run Code Online (Sandbox Code Playgroud)

我已经开始使用该功能,但无法使其正常工作。

我认为一个函数应该:

  1. 将因子的每个级别放入向量中
  2. 为每个级别运行一个 lm 模型。
fit_each_level <- function(factor_variable) {

  # trying to: …
Run Code Online (Sandbox Code Playgroud)

r purrr tidyverse

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

`purrr:map()` 打印列表中的项目及其名称

我有一个简单的问题,我希望能够使用purrr::map()它。

我有一个命名项目列表(此示例使用mtcars数据集):

var_labels <- list(cyl = "气缸数",
                  disp =“位移”)

我可以打印所有chr列表项(打印是我真正问题的简化):

print_label <- 函数(x){
  打印(x)
}

地图(var_labels,打印_标签)

这使:

>[1]“气缸数”
>[1]“位移”
>$缸
>[1]“气缸数”
>
>$显示
>[1]“位移”

但我似乎无法打印列表项及其名称:

print_item_and_name <- 函数(x){
  打印(x)
  打印(名称(x))
}

地图(var_labels,print_item_and_name)

这给了我 NULL:

>[1]“气缸数”
>空
>[1]“位移”
>空
>$缸
>空

>$显示
>空

我真正的问题不仅仅是打印项目及其名称,但我怀疑如果我能找到这个简化步骤的解决方案,我应该能够解决我的真正问题。

期望的输出是:

>[1]“气缸数”
> “圆柱”
>[1]“位移”
     “显示”

r purrr tidyverse

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

更改 SHAP 图的纵横比

我想更改从shap库生成的绘图的纵横比。

下面的最小可重复示例图:

import numpy as np
import pandas as pd  
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
import shap


boston = load_boston()
regr = pd.DataFrame(boston.data)
regr.columns = boston.feature_names
regr['MEDV'] = boston.target

X = regr.drop('MEDV', axis = 1)
Y = regr['MEDV']

fit = LinearRegression().fit(X, Y)

explainer = shap.LinearExplainer(fit, X, feature_dependence = 'independent')

shap_values = explainer.shap_values(X)
shap.summary_plot(shap_values, X)
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法保存该图:

fig = shap.summary_plot(shap_values, X, show = False)
plt.savefig('fig_tes1.svg', bbox_inches='tight',dpi=100)
Run Code Online (Sandbox Code Playgroud)

但我无法更改纵横比,例如将其宽度与高度设为 4:3。

我读到我应该能够

plt.gcf()
Run Code Online (Sandbox Code Playgroud)

但对我来说,这只是创建了一个新的空白情节。

<Figure size …
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas shap

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

从公式中提取所有唯一变量

我将lm()模型的公式存储为chr变量,并尝试将公式中的所有变量提取到向量中。

为了使其可复制,使用mtcars变量:mpg, cyl, 和drat(并且我的公式在示例中具有转换等)

model_string <- "mpg ~ cyl + I(abs(0.5-drat)) + I((0.5 - drat)^2)"
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

vars_used <- c("mpg", "cyl", "drat")
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所做的是:

library(tidyverse)
vars_used <- model_string %>% 
  str_extract_all(pattern = "\\w+") %>% 
  pluck(1) %>% 
  str_remove_all(pattern = "[0-9]")

vars_used

Run Code Online (Sandbox Code Playgroud)
[1] "mpg"  "cyl"  "I"    "abs"  ""     ""     "drat" "I"    ""     ""     "drat" ""    
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来完成我想要做的事情,特别是使用 tidytext?

我仍然需要删除向量中的空字符串,并删除重复项。

regex r tidyverse tidytext

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

使用变量中的值作为参数的Filter()

我希望能够filter(),其中参数值是已经定义的变量。

因此,例如,使用可重现的mtcars数据集:

library(tidyverse)
df <- mtcars
head(df)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3 …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyverse

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

标签 统计

r ×11

tidyverse ×7

dplyr ×5

purrr ×4

mutate ×3

stargazer ×2

lapply ×1

matplotlib ×1

pandas ×1

paste ×1

python ×1

regex ×1

regression ×1

rename ×1

shap ×1

tidytext ×1