如何在 R 中分割在不同点(基于字符位置)切割的变量(数据集中)

问题描述 投票:0回答:2

我目前正在开发一个项目,我必须将一个变量分成两部分。我已经看过类似的问题,但它们没有帮助我。

原始数据集是用SPSS创建的。这是一个简短的变体来说明这一点。

df <- data.frame(code = c("013101", "013102", "013205", "114113"), s01_01 = c(1, 4, 2, 3), s01_02 = c(4, 3, 2, 4))

变量“code”是孩子的代码,因为有前导零,所以是字符变量。 另外两个变量是孩子们回答的示例问题。 变量“代码”中的前两位数字(例如 01)表示学校,数字三和四(例如 31)表示班级。最后两个区分班级内的孩子。

我现在想将变量“code”拆分为变量“school”和变量“class”。

到目前为止,我最好的选择是“data_separate”功能。

library(datawizard)
df <-
  data_separate(
  df,
  select = code,
  new_columns = c("school", "class"),
  separator = 3,
  append=TRUE
) 

现在我已经把学校分开了,但是变量“班级”仍然包含班级和个别孩子。

我没有找到如何创建两个剪切方式不同的变量的解决方案。大多数围绕分离函数的解决方案都集中于了解分离变量的模式。因为我没有像“-”之类的分隔符。 那么我怎样才能准确地告诉 R 我希望如何分割变量呢?

r split tidyr
2个回答
1
投票

你说你试图将

code
拆分为两个变量,但从你的描述来看,你实际上试图将其拆分为3个变量:学校、班级和孩子。

您可以使用

tidyr::separate
来执行此操作,创建 3 个新列,并通过在第二个和第四个字符之后将其剪切来将
code
拆分为 3 个变量。

tidyr::separate(df, code, into = c('school', 'class', 'child'), sep = c(2, 4))
#>   school class child s01_01 s01_02
#> 1     01    31    01      1      4
#> 2     01    31    02      4      3
#> 3     01    32    05      2      2
#> 4     11    41    13      3      4

0
投票

这可以通过

base R
中的单个函数来实现:

df$school <- substr(df$code, 1, 2)
df$class <- substr(df$code, 3, 4)
df$child <- substr(df$code, 5, 6)
df$code <- NULL # optional 
df
> df
  s01_01 s01_02 school class child
1      1      4     01    31    01
2      4      3     01    31    02
3      2      2     01    32    05
4      3      4     11    41    13
© www.soinside.com 2019 - 2024. All rights reserved.