我正在关注 H. Wickham 的R for Data Science   ,但无法使那本书中的代码片段起作用。我参考了这部分和本书的以下图表。 
  .
 .
我从字面上复制并粘贴了书中的部分代码,但它没有按预期工作。
library(tidyverse)
library(forcats)
by_age <-  gss_cat %>%
  filter(!is.na(age)) %>%
  group_by(age, marital) %>%
  count() %>%
  mutate(prop = n / sum(n))
ggplot(by_age, aes(age, prop, color = marital)) +
  geom_line(na.rm = TRUE)
即使我ungroup() %>%在mutate()它绘制一些东西之前使用,而不是书中的内容(略有不同的模式)。
如果有人能解释这个悖论,我将不胜感激。
主要问题是prop在我的情况下都等于 1。结果,我在图上只得到一条水平线。
谢谢!
tidyverse 版本:1.1.1 R 版本 3.4.1 (2017-06-30) 平台:x86_64-w64-mingw32/x64 (64-bit) 运行环境:Windows 7 x64 (build 7601) Service Pack 1
我在下面有一个示例数据框。
example.df <- data.frame( 
species = sample(c("primate", "non-primate"), 50, replace = TRUE),
treated = sample(c("Yes", "No"), 50, replace = TRUE), 
gender = sample(c("male", "female"), 50, replace = TRUE), 
var1 = rnorm(50, 100, 5), resp=rnorm(50, 10,5), value1 = rnorm (50, 25, 5))
我想首先分组treated,然后循环遍历数据中的所有数字变量以使用作为解释变量的 dunn 测试(pairw.kw来自asbio包)species,提取summary数据框对象并将列yes和no子列表中的列绑定到一个新的数据框对象。
我已经在这里和这里使用部分“整洁”的方法获得了部分解决方案,该方法效果很好。我只是在寻找更优雅的 tidyverse 解决方案,以帮助我学习成为更好的 R 用户。
任何帮助表示赞赏。
编辑:这是我从部分“整洁”解决方案中的代码中获得的输出。
structure(list(var1.Diff = structure(1:2, .Label = c("-7.05229", 
"-2.25"), class = …我希望能够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 …考虑以下:
tribble(
  ~"1", ~"2", ~"3", ~"4",
  "bob", "sally", "fred","jim",
  "2011", "2012", "2013", "2014"
)
在上面,列“1”存储我们真正想要分隔列的值,例如:
tribble(
  ~col, ~name, ~year,
  "1", "bob", "2011",
  "2", "sally", "2012",
  "3", "fred", "2013",
  "4", "jim", "2014"
)
起初,我尝试过,pivot_longer(everything())但这会产生重复的行。
  name  value
  <chr> <chr>
1 1     bob  
2 2     sally
3 3     fred 
4 4     jim  
5 1     2011 
6 2     2012 
7 3     2013 
8 4     2014
我考虑过尝试pivot_wider,但我无法部分选择上面值列中的年份或名称。
有任何想法吗?这当然是一个玩具示例 - 基本思想是采用多行并将它们转换为列而无需重复代码。
一年多以来,我一直在尝试为此找到解决方案,并决定写一篇关于它的文章。任何帮助,将不胜感激。这是我可以在 Stata 和 SAS 中轻松完成的伪代码,但我不知道如何在 R 中完成。{} 是今年引入 dplyr 的类似胶水的运算符,因此我将其用作占位符对于使伪代码工作的运算符。
library(tidyverse)
var <- "mpg"
df_name <- "mtcars"
{df_name} %>% count({var})
{df_name}_1 <- {df_name} %>% mutate(., {var}_1={var}/2)
length({df_name}_1)
应该导致
library(tidyverse)
var <- "mpg"
df_name <- "mtcars"
mtcars %>% count(mpg)
mtcars_1 <- mtcars %>% mutate(., mpg_1=mpg/2)
length(mtcars_1)
在 Stata 中,我可以轻松地使用本地或全局宏,如下所示:
local df_name "mtcars"
然后将其引用为“df_name”
在 SAS 中,我可以使用这样的全局宏来做到这一点:
 %LET df_name=mtcars;
然后像&df_name一样引用它。
请注意引用这些值在视觉上是多么容易——没有赋值、获取、括号、mget 等。
这两种方法都允许在数据集名称、函数、变量等中使用它们。极大地简化了我的代码并为我节省了大量时间。如何在 R 中以视觉简单的方式做到这一点?我的代码对于熟悉 Stata/SAS 的人来说应该是可读的(dplyr 在这方面很棒!)而且太多的 eval,将所有东西都包装在函数中,用括号赋值只会让他们放弃项目或迫使我改回SAS/Stata。
我尝试了 {{}}、!!、enquo、sym 和 NSE 的所有组合,但仍然不知道如何以视觉上简单的方式使其工作。在 dplyr 管道中,变量名称终于有了一些解决方法,但对于数据帧和基础 R 没有任何解决方法。 …
我的 data.frame 又出现了一些问题,我需要重组:
我的数据框如下所示。它描述了三个数据集 (1-3) 以及这三个数据集包含的列名:
df <- data.frame(df =   c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3),
                 vars = c("var1", "var2", "var3", "var4", 
                          "var1", "var1b", "var4", 
                          "var5", "var1", "var2", "var7"))
   df  vars
1   1  var1
2   1  var2
3   1  var3
4   1  var4
5   2  var1
6   2 var1b
7   2  var4
8   3  var5
9   3  var1
10  3  var2
11  3  var7
我的目标是有一个总表所示(该值是不完全从上面的那些),其中1只表示该变量包括在内,2个可变装置不包括在相应的数据帧df1到df3:
df %>% pivot_wider(names_from = df, values_from …如果我有看起来像这样的数据
id<-c(1,1,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,5,5)
age<-c(12,14,15,16,12,13,14,14,16,17,19,12,13,14,15,16,18,20,21)
grade<-c('B','C','C','A','D','B','B','A','B','A','A','D','F','B','F','F','B','B','C')
data<-data.frame(id,age,grade)
假设 ID 是每个学生 (1:5) 在不同时间测量他们的成绩,我想看看他们在获得第一个 B 后在什么年龄发生了随后的成绩变化。 对于 12 岁获得 B 的学生 1,他/她在 14 岁时获得了 C,这是直接的。然而,对于学生 5,他/她在 18 岁时第一次获得了 B,然后在 20 岁时再次获得了 B,所以一年级的变化发生在 21 岁,也就是 C。
我认为切片将是最好的选择。
data %>% group_by(id,grade) %>% slice(which.min(age))
但我不确定如何包括接下来的几行来捕捉 B 变成另一个等级的“年龄”(又不是 B)。
我在R工作,我有一个有趣的问题。我想转换下一个数据帧:
DF = data.frame(ID = c(1, 2, 3),
              Person1 = c("Devin Davey", "Rui Butt", "Keon Dotson"),
              Sign = "artist",
              Person2 = c("Eli Greer", "Alvin Simons", "Leona Ford"),
              Sex = c("female", "male", "female"),
              Score = c(10, 20, 30)) 
  ID     Person1   Sign      Person2    Sex Score
1  1 Devin Davey artist    Eli Greer female    10
2  2    Rui Butt artist Alvin Simons   male    20
3  3 Keon Dotson artist   Leona Ford female    30
像这样格式化:
  ID         Name   Sign Score
1  1  Devin …为什么下面将输出返回为data frame with 0 columns and 1 row,我也不知道这意味着什么。
运行的代码是
iris %>% summarise(across(everything(),nrow)) 
请注意,以下两个都按预期返回输出
iris %>% summarise(across(everything(),length))
iris %>% summarise(across(everything(),mean))
收到的理想输出
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
     150         150          150         150     150