【问题标题】:How to assign sequential values to a variable in R while defining sequence by number of values contained in a different variable如何在R中为变量分配顺序值,同时按不同变量中包含的值的数量定义顺序
【发布时间】:2019-07-24 01:13:22
【问题描述】:

我有患者数据,其中患者在不同时间点接受了相同的评估。我想按日期对这些评估进行编号。

这是我的意见:

12 x 3 df with cols: pt_id, assess_date, assess_id

这是我想要的输出:

12 x 5 df with cols: pt_id, assess_date, assess_id, num_assess, assess_num

这是我尝试过的:

data <- data %>% 
           group_by(pt_id) %>%
           mutate(num_assess <- n_distinct(assess_date))

data$assess_num <- NA

data <- data %>% 
           group_by(pt_id) %>% 
           for(i in 1:num_assess) {
              assess_num <- i
            }

我也尝试使用 n_distinct 来定义序列而不创建assess_num 变量,但这也不起作用

这是我得到的错误:

for (.in i) 1:num_assess 中的错误: 4 个参数传递给“for”,需要 3 个

想法?蒂亚!

【问题讨论】:

  • 嘿 tws061105,感谢您发布您所尝试的内容。发reproducible example也是一个好习惯。在那张纸条上,assess_date 是日期还是字符串?如果是,您可以使用以下内容提取月份:as.numeric(format(x, "%m"))(假设您希望它是数字)。
  • 嘿安德鲁 - 谢谢你的建议!这绝对是有道理的!我会在以后的帖子中记住这一点!

标签: r for-loop


【解决方案1】:

这是一个简化版本,使用您的日期(作为因素)来简单地提取每个变量的水平:

data.example = structure(list(pt_id = c(1234L, 1234L, 1234L, 1234L, 4567L, 4567L, 
                  4567L, 4567L, 8900L, 8900L, 8900L, 8900L), assess_date = structure(c(1L, 
                  2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("1/1/2019", 
                  "1/2/2019", "1/3/2019", "1/4/2019"), class = "factor"), assess_id = c(64L, 
                  64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L)), class = "data.frame", row.names = c(NA, 
                  -12L))

data.example <- data.example %>% 
  group_by(pt_id) %>%
  mutate(assess_num = as.integer(assess_date))

如果它们(还)不是因素,那么:

data.example <- data.example %>% 
  group_by(pt_id) %>%
  mutate(assess_num = as.integer(as.factor(assess_date)))

输出如下:

# A tibble: 12 x 4
# Groups:   pt_id [3]
   pt_id assess_date assess_id assess_num
   <int> <fct>           <int>      <int>
 1  1234 1/1/2019           64          1
 2  1234 1/2/2019           64          2
 3  1234 1/3/2019           64          3
 4  1234 1/4/2019           64          4
 5  4567 1/1/2019           64          1
 6  4567 1/2/2019           64          2
 7  4567 1/3/2019           64          3
 8  4567 1/4/2019           64          4
 9  8900 1/1/2019           64          1
10  8900 1/2/2019           64          2
11  8900 1/3/2019           64          3
12  8900 1/4/2019           64          4

编辑: 以下是一组更明确的潜在解决方案,具体取决于原始 access_date 列类是什么:

library(tidyr)
library(dplyr)

# data.example as tibble:
data.example = structure(list(pt_id = c(1234L, 1234L, 1234L, 1234L, 4567L, 4567L, 
  4567L, 4567L, 8900L, 8900L, 8900L, 8900L), assess_date = structure(c(1L, 
  2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("1/1/2019", 
  "1/2/2019", "1/3/2019", "1/4/2019"), class = "factor"), assess_id = c(64L, 
  64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L)), row.names = c(NA, 
  -12L), class = c("tbl_df", "tbl", "data.frame"))

# if assess_date is the string class:
data.example <- data.example %>% 
  group_by(pt_id) %>%
  mutate(assess_num = as.integer(as.factor(assess_date)))

# if assess_date is the factor class:
data.example <- data.example %>% 
  group_by(pt_id) %>%
  mutate(assess_num = as.integer(as.factor(as.Date(assess_date,"%m/%d/%Y"))))

# if assess_date is the Date class:
data.example <- data.example %>% 
  group_by(pt_id) %>%
  mutate(assess_num = as.integer(as.factor(assess_date)))

【讨论】:

  • @tws061105,L 表示该值为an integer。您可以通过获取全部或部分示例数据并使用dput(例如dput(mtcars))来创建可重现的数据。
  • 其实这不太行。当我刚刚运行建议的解决方案时它起作用了,但是当我将它应用到我的实际数据时,它并不完全起作用。我看到这个提议的解决方案将评估日期的“级别”确定为assess_date = structure(c(1L,2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L),然后标记那些有这些评估日期的人,但在我的实际数据中,我不能轻易地将日期转换为整数,并且将整列转换为一个因子也不太有效,因为可以在不同的日子对患者进行评估(没有一组评估日期)
  • 感谢您的帮助,感谢您耐心等待我发布我的数据的简化版本,该版本不太理想且不可重现:/
  • @tws061105,查看编辑内容,看看它是否能解决您的问题。如果access_date 列类是factor,或者您如上所述将其转换为一个,则您不需要进行从Dateinteger 的任何映射,这将为您映射日期
【解决方案2】:

来自@desc 的巧妙解决方案。如果您的日期格式为日期,并且您希望它是数字,则以下脚本有效。这使用了 desc 中的 data.example(谢谢),但日期格式是 d/m/y,这就是为什么 as.Date 中的 format"%d/%m/%Y"

> data.example = structure(list(pt_id = c(1234L, 1234L, 1234L, 1234L, 4567L, 4567L, 
+                                         4567L, 4567L, 8900L, 8900L, 8900L, 8900L), assess_date = structure(c(1L, 
+                                                                                                              2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("1/1/2019", 
+                                                                                                                                                                      "1/2/2019", "1/3/2019", "1/4/2019"), class = "factor"), assess_id = c(64L, 
+                                                                                                                                                                                                                                            64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L, 64L)), class = "data.frame", row.names = c(NA, 
+                                                                                                                                                                                                                                                                                                                                         -12L))
> 
> data.example$assess_date <- as.Date(data.example$assess_date, format = "%d/%m/%Y")
> data.example$assess_num <- as.numeric(format(data.example$assess_date, "%m"))
> data.example
   pt_id assess_date assess_id assess_num
1   1234  2019-01-01        64          1
2   1234  2019-02-01        64          2
3   1234  2019-03-01        64          3
4   1234  2019-04-01        64          4
5   4567  2019-01-01        64          1
6   4567  2019-02-01        64          2
7   4567  2019-03-01        64          3
8   4567  2019-04-01        64          4
9   8900  2019-01-01        64          1
10  8900  2019-02-01        64          2
11  8900  2019-03-01        64          3
12  8900  2019-04-01        64          4

【讨论】:

  • 谢谢@Andrew!这看起来依赖于不同月份发生的评估,这对我来说并非总是如此(但我承认这与我提供的示例一致)。不过,感谢您的参与,并感谢您的批评:发布可重现的示例
  • 当然可以,我很高兴您找到了适用于您的数据的解决方案!此外,如果您的问题得到解决(即接受 desc 的回答),通常会在解决您的问题的答案旁边打勾。也感谢您的跟进!
【解决方案3】:

非常感谢您的建议。不幸的是,我无法获得任何建议的解决方案,但根据以下代码,我确实在 splitstackshape 包的 getanID 函数中找到了我需要的东西:

getanID(data, "pt_id") - 就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2022-12-18
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多