2016-12-06 101 views
1

选择最后n个字符我有以下数据集在一个字符串

df <-data.frame(fact=c("a,bo,v", "c,b,v,d", "c")) 

我要选择的最后两个项目的每一行。因此,理想的情况是我希望有这样的输出:

fact 
1 bo,v 
2 v,d 
3 c 

我试图拆行,然后选择最后两个项目:

spl <- strsplit(as.character(df$fact), split = ",") 

tail(spl[[1]], n=2) 

不过母鹿不给我正确的结果

+1

strsplit()用于分割字符串,你给它一个因子而不是一个字符串,这就是为什么它会抛出一个错误。 –

+0

没错,我试过这个'spl < - strsplit(as.character(df $ fact),split =“,”)',但没有给我正确的结果。我编辑了这个问题。 – MFR

+1

查看Chirayu的答案,您需要将函数strsplit()应用于df列。换句话说,你有一串字符串,现在你需要分割每一个,apply(),lapply(),sapply()是应用函数的工具。 –

回答

3

你可以这样做:

lapply(lapply(strsplit(as.character(df$fact), split = ','), function(x) x[c(length(x)-1,length(x))]), paste, collapse = ',') 

拆分山坳然后提取n和n-1的索引。然后粘贴在一起。

您可以通过执行此概括为:

lapply(strsplit(as.character(df$fact), split = ','), function(x) x[(length(x)-n):length(x)]) 

,其中n是不落后的步骤,你要采取。使用tail更简单。

lapply(strsplit(as.character(df$fact), split = ','), tail, n=2) 
+0

不错的选择。加一。 – akrun

1

我们可以超过fact每个元素使用sapply循环,split它的,基础上再使用tail

n <- 2 

sapply(as.character(df$fact), function(x) { 
     temp = unlist(strsplit(x, ',')) 
     tail(temp, n) 
}, USE.NAMES = F) 

#[[1]] 
#[1] "bo" "v" 

#[[2]] 
#[1] "v" "d" 

#[[3]] 
#[1] "c" 

dplyr我一个更好的选择选择最后n元素感觉使用rowwise

library(dplyr) 
df %>% 
rowwise() %>% 
mutate(last_two = paste0(tail(unlist(strsplit(as.character(fact),",")), n), 
                   collapse = ",")) 

#  fact last_two 
# <fctr> <chr> 
#1 a,bo,v  bo,v 
#2 c,b,v,d  v,d 
#3  c  c