سؤال
أنا أحاول تقسيم سلسلة على "." وإنشاء أعمدة إضافية مع سلسلتين قبل وبعد ".".
tes<-c("1.abc","2.di","3.lik")
dat<-c(5,3,2)
h<-data.frame(tes,dat)
h$num<-substr(h$tes,1,1)
h$prim<-unlist(strsplit(as.character(h$tes),"\\."))[2]
h$prim<-sapply(h$tes,unlist(strsplit(as.character(h$tes),"\\."))[2])
أود أن h$prim
لاحتواء "ABC" ، "DI" ، "Lik" .. ومع ذلك لا أستطيع معرفة ذلك. اعتقد strsplit
غير موجود ، ولكن بعد ذلك اعتقدت sapply
يجب أن يكون الإصدار يعمل. ومع ذلك أفترض أنه يجب أن يكون سهلاً :-)
التحيات ، // م
المحلول
هذا ينبغي أن تفعل خدعة
R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di" "lik"
نصائح أخرى
مع ال stringr
الحزمة أسهل:
library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]
هذا هو نفس إجابة RCS ، ولكن قد يكون من الأسهل فهم:
> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di" "lik"
يظهر هذا السؤال عدة وقت على Stackoverflow.
في شكل دقيق لك:
- اختيار العنصر الأول من
strsplit
- اختيار العنصر الثاني منفصل حسب الفضاء
- اختيار العنصر الثاني منفصل بواسطة DOT أوصي بهذا السؤال لمعرفة عدد الطرق التي يمكن تحقيقها.
سؤال مماثل في هذا الموضوع:
وإذا كنت تهتم بالسرعة ، فعليك التفكير نصيحة من إجابة جون fixed
المعلمة ل strsplit
.
بدلاً من ذلك ، يمكنك أن تنقذ نفسك من عمل سحب العنصر الثاني إذا قمت بإضافة كلا العمدين في نفس الوقت:
tes <- c("1.abc","2.di","3.lik")
dat <- c(5,3,2)
h <- data.frame(tes, dat, stringsAsFactors=FALSE)
values <- unlist(strsplit(h$tes, ".", fixed=TRUE))
h <- cbind(h, matrix(values, byrow=TRUE, ncol=2,
dimnames=list(NULL, c("num", "prim"))))
لا تنتمي إلى StackOverflow