标签: data-wrangling

R:更改pivot_wider() 中的列名——前缀的后缀

我试图弄清楚如何改变 tidyrpivot_wider()函数在生成的宽数据集中创建新变量名称的方式。具体来说,我希望将“names_from”变量添加到新变量的前缀而不是后缀。

我的数据集看起来像:

list(ID = c("A950", "A950", "A950", "A970", "A970", "A970", "A996", "A996", "A996"), 
Phase = c("P1", "P2", "P3", "P1", "P2", "P3", "P1", "P2", "P3"), 
A = c(23.5, 25.2, 21.9, 21.9, 21.1, 20.3, 19.5, 18.7, 17.9), 
B = c(21.9, 21.1, 20.3, 19.5, 18.7, 17.9, 17.1, 16.3, 15.5), 
C = c(25.2, 21.9, 20.3, 17.6, 15.1, 12.7, 10.3, 7.8, 5.4), 
D = c("M", "M", "M", "F", "F", "F", "N", "N", "N"))
Run Code Online (Sandbox Code Playgroud)

当我使用pivot_wider()Phase 作为“关键”来传播数据集时,我的结果如下所示:

ex_wide <- ex_long %>%
  pivot_wider(names_from …
Run Code Online (Sandbox Code Playgroud)

r reshape tidyr data-wrangling

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

如何为数据整理编写有效的包装器,允许在调用包装器时关闭任何包装的部分

为了简化数据整理,我编写了一个由处理数据的几个“动词函数”组成的包装函数。每个人对数据执行一项任务。但是,并非所有任务都适用于通过此过程的所有数据集,有时,对于某些数据,我可能想关闭一些“动词功能”,并跳过它们。

我试图了解是否有一种传统/规范的方式来在 R 的包装器函数中构建这样的工作流。重要的是,一种高效的方式,无论是性能方面还是简洁的代码。

例子

作为数据整理的一部分,我想执行几个步骤:

  1. 清理列标题(使用janitor::clean_names()
  2. 重新编码数据中的值,这样TRUEFALSE被替换为10(使用gsub())。
  3. 将字符串值重新编码为小写(使用tolower())。
  4. 根据特定id列旋转更宽(使用tidyr::pivot_wider
  5. 删除带有NA值的行(使用dplyr::drop_na()

玩具数据

library(stringi)
library(tidyr)

set.seed(2021)

# simulate data
df <-
  data.frame(id = 1:20,
           isMale = rep(c("true", "false"), times = 10),
           WEIGHT = sample(50:100, 20),
           hash_Numb = stri_rand_strings(20, 5)) %>%
  cbind(., score = sample(200:800, size = 20))

# sprinkle NAs randomly
df[c("isMale", "WEIGHT", "hash_Numb", "score")] …
Run Code Online (Sandbox Code Playgroud)

r function wrapper user-defined-functions data-wrangling

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

使用 dplyr 的每组前“n”行——每组具有不同的数量

我将使用内置chickwts数据作为示例。

这是数据,有 5 种提要类型。

> head(chickwts)

  weight      feed
1    179 horsebean
2    160 horsebean
3    136 horsebean
4    227 horsebean
5    217 horsebean
6    168 horsebean

> table(chickwts$feed)

   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12 
Run Code Online (Sandbox Code Playgroud)

我想要的是每种饲料类型按重量计算的前几行。但是,对于每种 Feed 类型我都需要不同的编号吗?例如,

top_n_feed <-
  c(
    "casein" = 3,
    "horsebean" = 5,
    "linseed" = 3,
    "meatmeal" = 6,
    "soybean" = 3,
    "sunflower" = 2
  )
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点dplyr

要按n重量获得每种提要类型的顶行,我可以使用如下代码,但我不确定如何将其扩展到每种提要类型的不同数字。

chickwts %>%
  group_by(feed) %>% 
  slice_max(order_by = weight, …
Run Code Online (Sandbox Code Playgroud)

r dplyr data-cleaning data-wrangling

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

R:从预先存在的数据帧创建新行

我想根据数据集中预先存在的行的值创建新行。有两个问题:首先,某些单元格值需要保持不变,而其他单元格值必须增加 +1。其次,我需要以相同的次数循环遍历每一行。

我觉得用数据会更容易理解

我从这里开始:

mydata <- data.frame(id=c(10012000,10012002,10022000,10022002),
                     col1=c(100,201,44,11),
                     col2=c("A","C","B","A"))
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

mydata2 <- data.frame(id=c(10012000,10012001,10012002,10012003,10022000,10022001,10022002,10022003),
                     col1=c(100,100,201,201,44,44,11,11),
                     col2=c("A","A","C","C","B","B","A","A"))
Run Code Online (Sandbox Code Playgroud)

请注意我如何在每个新行的 id 列单元格中添加 +1,但 col1 和 col2 保持不变。

谢谢

r dplyr tidyr tidyverse data-wrangling

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

R 中的 Pivot_longer() 没有分隔符?

我正在尝试使用R 中的pivot_longer()转换表。但分隔不是由任何常见符号,例如“_”或“。”。而是通过列名的结尾方式(“B”或“T”)。我尝试使用正则表达式,但没有太大成功。

下面是示例原始表以及我希望最终转换后的表如何。非常感谢您的帮助。

原表:

tibble(Datetime = seq(as.Date("2000/1/1"), by = "month", length.out = 10), 
           `ABC1-P1B` = seq(1,10),
           `ABC1-P1T` = seq(101,110),
           `ABC1-P2B` = seq(11,20),
           `ABC1-P2T` = seq(201,210))
# A tibble: 10 x 5
   Datetime   `ABC1-P1B` `ABC1-P1T` `ABC1-P2B` `ABC1-P2T`
   <date>          <int>      <int>      <int>      <int>
 1 2000-01-01          1        101         11        201
 2 2000-02-01          2        102         12        202
 3 2000-03-01          3        103         13        203
 4 2000-04-01          4        104         14        204
 5 2000-05-01          5        105         15        205
 6 2000-06-01          6        106         16        206
 7 …
Run Code Online (Sandbox Code Playgroud)

r dplyr data-wrangling

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

根据 R 上的其他条目填充缺失值

我的数据集有input几个缺失值。我必须output使用以下逻辑创建数据集:

\n
    \n
  • b如果、c、 或 中的任何列中存在缺失d,则\n检查相应的a列并使用从该行到特定列的\n相应值填充缺失的部分。
  • \n
\n

我尝试使用_join来自的函数来做到这一点dplyr,但没有成功。

\n

我可以手动执行此操作,但此选项不可行,因为我有一个包含多个此类实例的大数据集。

\n

输入

\n
library(dplyr)\n\ninput <- tibble( a = rep(c("A", "B", "C", "D"),2 ),\n        b = c(1:3, NA, rep(NA,4)),\n        c = c(21:28),\n        d = c(rep(NA,4), 54, NA, 34,11)) %>% \n  arrange(a)\n
Run Code Online (Sandbox Code Playgroud)\n

输入视图

\n
# A tibble: 8 \xc3\x97 4\n#  a         b     c     d\n#  <chr> <int> <int> <dbl>\n#1 A         1    21    NA\n#2 A        NA    25 …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyverse data-wrangling

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

如何根据另一列中较大的值过滤行?

我有一个如下所示的数据框

d1<-c('a','b','c','d','e','f','g','h','i','j','k','l')

d2<-c(1,5,1,2,13,2,32,2,1,2,4,5)

df1<-data.frame(d1,d2)
Run Code Online (Sandbox Code Playgroud)

看起来就像这张图中的数据表

在此输入图像描述

我的目标是根据每 3 行中 d2 的值最大的值来过滤行。所以它看起来像这样: 在此输入图像描述 谢谢你!

r dataframe dplyr data-wrangling

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

如何在 R 中“换行”行?

我目前有一个数据集,其中的所有信息都在一行(或一列,如果我转置)中。数据中的第一项实际上是列名:

Country | Population | Country Column One | Country Column 2 | USA | 400 million | USA Column 1 | USA Column 2 | Canada | 38 Million | Canada Column 1 | Canada Column 2 | etc..
Run Code Online (Sandbox Code Playgroud)

我注意到,一旦到达新的国家/地区,我就可以“换行”并让所有内容从新行开始。我该怎么办呢?有更有效的方法吗?

string r dataframe data-wrangling

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

为什么我的 ifelse 语句将因子转换为数字?

我在改变 . 中的变量时遇到了一个奇怪的问题dplyr。如果我运行这段代码:

diamonds %>% 
  select(cut) %>% 
  table()
Run Code Online (Sandbox Code Playgroud)

我在 R 中看到了数据集中因素的列表diamonds

cut
     Fair      Good Very Good   Premium     Ideal 
     1610      4906     12082     13791     21551 
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试更改其中一个名称并保留其余名称:

diamonds %>% 
  mutate(cut.fix = ifelse(cut == "Fair",
                          "Not Fair at All",
                          cut)) %>% 
  select(cut.fix) %>% 
  table()
Run Code Online (Sandbox Code Playgroud)

它只会更改“固定”值,其他所有内容都会变成数值:

cut.fix
              2               3               4               5 
           4906           12082           13791           21551 
Not Fair at All 
           1610 
Run Code Online (Sandbox Code Playgroud)

这是什么原因?我该如何解决?

r filter dataframe dplyr data-wrangling

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

如何在 R 中省略 table1 中的缺失值行

我有一个数据集如下。当我使用 table1() 从中创建 table1 时,会给出一行用于缺失值。我想知道是否可以从变量之一(例如 var3)中排除“缺失行”。

我想这样做的原因是因为,在我的实际数据集中,我的住院时间是可变的。并非数据集中的所有个人都在医院,因此这些患者没有丢失数据,他们只是没有此变量的数据,因为他们不在医院提供数据。

任何帮助将不胜感激,谢谢。

data <- data.frame(
  var1 = c(1, 2, NA, 4, 5),
  var2 = c("A", "B", NA, "D", "E"),
  var3 = c(10, NA, 30, 40, 50)
)

table1(~var1 + var2 + var3, data=data) 
Run Code Online (Sandbox Code Playgroud)

r html-table data-cleaning data-wrangling

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