R语言数据reshape:dplyr包函数pivot_longer

1.一个示例

在 dplyr 中,pivot_longer 函数用于将数据从宽格式变为长格式。以下是一个简单的例子,演示如何使用 pivot_longer:

假设你有一个数据框(data frame)如下:

library(dplyr)

# 创建示例数据框
data <- data.frame(
  ID = c(1, 2, 3),
  Name = c("Alice", "Bob", "Charlie"),
  Math_Score_Week1 = c(80, 90, 75),
  Math_Score_Week2 = c(85, 88, 92),
  English_Score_Week1 = c(70, 85, 80),
  English_Score_Week2 = c(75, 78, 88)
)

# 查看原始数据
print(data)

  ID    Name      Math_Score_Week1    Math_Score_Week2   English_Score_Week1   English_Score_Week2
1  1   Alice               80               85                  70                  1                  75
2  2     Bob               90               88                  85                  2                  78
3  3 Charlie               75               92                  80                  3                  88

上述数据框中,Math_Score_Week1 和 Math_Score_Week2 是两个不同周的数学成绩,English_Score_Week1 和 English_Score_Week2 是两个不同周的英语成绩。你希望将这些数据从宽格式转换为长格式。

使用 pivot_longer 可以实现这一目标:

data_long <- data %>%
  pivot_longer(
    cols = starts_with("Math_Score") | starts_with("English_Score"),
    names_to = c(".value", "Week"),  # 指定列名的拆分规则
    names_sep = "_"
  )

# 查看转换后的数据
print(data_long)

Warning message:
"[1m[22mExpected 2 pieces. Additional pieces discarded in 4 rows [1, 2, 3, 4]."


[90m# A tibble: 6 × 5[39m
     ID Name    Week   Math English
  [3m[90m<dbl>[39m[23m [3m[90m<chr>[39m[23m   [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m   [3m[90m<dbl>[39m[23m
[90m1[39m     1 Alice   Score    80      70
[90m2[39m     1 Alice   Score    85      75
[90m3[39m     2 Bob     Score    90      85
[90m4[39m     2 Bob     Score    88      78
[90m5[39m     3 Charlie Score    75      80
[90m6[39m     3 Charlie Score    92      88

这里,pivot_longer 的参数包括:

cols:指定要进行长格式转换的列。
names_to:用于指定新列的名称。在这个例子中,我们使用 .value 来表示数学和英语成绩的部分,同时指定了一个额外的 Week 列。
names_sep:指定用于分割列名的字符,在这里是下划线 "_”。
这样,原始数据的宽格式就被转换成了长格式,每个学生每周的数学和英语成绩都被整理到了新的行中。

2.option的解释

  1. names_prefix
    • 描述: names_prefix 是一个正则表达式,用于从每个变量名称的开头删除匹配的文本。
    • 用法: 如果你的变量名称有一个共同的前缀,而你希望在转换过程中去掉这个前缀,可以使用 names_prefix
  2. names_pattern
    • 描述: names_pattern 是一个正则表达式,用于从变量名称中提取匹配组。
    • 用法:names_to 包含多个值时,names_pattern 可以帮助你指定如何从变量名称中提取信息,以创建新的列。例如,在你的数据中,如果有一列变量名是类似 “new_diagnosis_m014” 的话,你可以使用 names_pattern = "new_?(.*)_(.)(.*)" 来提取诊断、性别和年龄信息。
  3. names_ptypesvalues_ptypes
    • 描述: 这两个参数分别是列名和值的原型(prototype),它们用于指定新创建的列和值的预期类型。
    • 用法: 如果你想确认新创建的列的类型是否符合预期,可以使用这两个参数。例如,如果你期望新的列是整数类型,可以使用 names_ptypes = list(week = integer())
  4. names_transformvalues_transform
    • 描述: 这两个参数是列名和值的转换函数,用于在创建新列和值时进行类型转换。
    • 用法: 如果你需要对特定列进行类型转换,可以使用这两个参数。例如,如果你想将某个字符变量转换为整数,可以使用 names_transform = list(week = as.integer)
  5. names_repair
    • 描述: names_repair 定义了输出具有无效列名时的行为。
    • 用法: 默认值是 “check_unique”,如果输出的列名重复,会报错。可以设置为 “minimal” 允许输出中有重复列,或者设置为 “unique” 通过添加数字后缀来去重。
  6. names_to
    • 描述: names_to 是一个字符向量,用于指定从列名中提取信息创建的新列的名称。
    • 用法: 具体用法取决于 names_to 的长度。如果长度为 1,将创建一个包含指定列名的新列。如果长度大于 1,则需要使用 names_sepnames_pattern 指定如何拆分列名。

3.names_prefix:实例

假设你有以下数据框,其中的列名以 “X_” 开头,而你想要在转换时去掉这个前缀:

# 假设有以下数据框
data <- data.frame(
  ID = c(1, 2, 3),
  Name = c("Alice", "Bob", "Charlie"),
  X_Math_Score_Week1 = c(80, 90, 75),
  X_Math_Score_Week2 = c(85, 88, 92)
)

使用 pivot_longer 函数,并结合 names_prefix 参数,可以进行如下转换:

library(dplyr)

# 使用 names_prefix 删除 X_
data_long <- data %>%
  pivot_longer(
    cols = starts_with("X_"),
    names_to = "Math_Score_Week",
    names_prefix = "X_",
    values_to = "Math_Score"
  )

# 查看转换后的数据
print(data_long)

这样,names_prefix = “X_” 就会在转换过程中去掉列名的 “X_” 前缀,得到如下的结果:

# A tibble: 6 × 4
     ID Name    Math_Score_Week Math_Score
  <dbl> <chr>   <chr>           <dbl>
1     1 Alice   Week1              80
2     1 Alice   Week2              85
3     2 Bob     Week1              90
4     2 Bob     Week2              88
5     3 Charlie Week1              75
6     3 Charlie Week2              92

4.names_pattern:实例

假设你有以下数据框,其中的列名包含有关个体诊断、性别和年龄的信息,而你想要在转换时提取这些信息:

# 假设有以下数据框
data <- data.frame(
  ID = c(1, 2, 3),
  Name = c("Alice", "Bob", "Charlie"),
  new_diagnosis_m014 = c(10, 15, 8),
  new_diagnosis_f014 = c(5, 8, 12)
)

使用 pivot_longer 函数,并结合 names_pattern 参数,可以进行如下转换:

library(dplyr)

# 使用 names_pattern 提取诊断、性别和年龄信息
data_long <- data %>%
  pivot_longer(
    cols = starts_with("new_"),
    names_to = c("diagnosis", "gender", "age"),
    names_pattern = "new_?(.*)_(.)(.*)",
    values_to = "count"
  )

# 查看转换后的数据
print(data_long)

这样,names_pattern = “new_?(.)_(.)(.)” 就会在转换过程中提取诊断、性别和年龄信息,得到如下的结果:

# A tibble: 6 × 5
     ID Name     diagnosis gender   age   count
  <dbl> <chr>    <chr>     <chr>    <chr> <dbl>
1     1 Alice    diagnosis m        014      10
2     1 Alice    diagnosis f        014       5
3     2 Bob      diagnosis m        014      15
4     2 Bob      diagnosis f        014       8
5     3 Charlie  diagnosis m        014       8
6     3 Charlie  diagnosis f        014      12
  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengke25

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值