如何在data.table中操作和分隔字符串到两列

时间:2015-11-16 05:44:33

标签: r string data.table

我有17000条记录,需要将记录1中的变量YearSem分解为两个单独的列'Year'和'Sem'。

template<class T>
struct cls_number_of_elements {};

template<class T, std::size_t R>
struct cls_number_of_elements<T[R]> {
  static const int N = R;
};

char ary[] = "12345";
auto const N = cls_number_of_elements<decltype(ary)>::N;
char ar2[N];

我需要什么

student_ID=c("1001","1002","1005","1010")
YearSem=c("2011/1","2012/2","2015/1","2015/2")
Grade=c("Pass","Fail","Pass","Fail")
record1<-data.table(student_ID,YearSem,Grade)

4 个答案:

答案 0 :(得分:4)

由于您已经在使用 data.table ,因此可以使用tstrsplit()拆分列。它是最新的data.table CRAN版本1.9.6版的一部分。我们可以将YearSem列拆分为两个新列,然后一次性将其全部删除。

setcolorder(
    record1[, c("Year", "Sem", "YearSem") := 
        c(tstrsplit(YearSem, "/", fixed = TRUE), list(NULL))],
    c(1, 3, 4, 2)
)

哪个给出了

   student_ID Year Sem Grade
1:       1001 2011   1  Pass
2:       1002 2012   2  Fail
3:       1005 2015   1  Pass
4:       1010 2015   2  Fail

如果您希望将新列转换为最合适的类型(此处为整数),则可以将type.convert = TRUE添加到tstrsplit()

答案 1 :(得分:2)

我们可以使用separate中的tidyr

library(tidyr)
separate(record1, YearSem, into=c('Year', 'Sem'), convert=TRUE)
#     student_ID Year Sem Grade
#1:       1001 2011   1  Pass
#2:       1002 2012   2  Fail
#3:       1005 2015   1  Pass
#4:       1010 2015   2  Fail

如果我们不想使用任何包,则另一个选项是read.table。但是,因为它是data.table

record1[,c('Year', 'Sem') := read.table(text=YearSem,sep='/')
         ][,YearSem:= NULL]

答案 2 :(得分:2)

只是一种不使用任何其他包的方式......

YearSem = matrix(unlist(strsplit(YearSem,'/')),2,length(YearSem))
Year = YearSem[1,]
Sem = YearSem[2,]

> Year
[1] "2011" "2012" "2015" "2015"
> Sem
[1] "1" "2" "1" "2"

答案 3 :(得分:1)

如何使用str_split_fixed

 record1$year <- str_split_fixed(record1$YearSem, "/", 2)[,1]
 record1$sem <- str_split_fixed(record1$YearSem, "/", 2)[,2]