我有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)
答案 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]