2017-01-12 21 views
3

私の問題は、パスを分割し、すべてのサブパスを次の "$"オブジェクト(累積サブパスの一種)まで取得し、それぞれに新しい変数を生成することです。サブストリングを取得し、ループを使用して変数に格納する

それは私が所望の出力を得るステップバイステップで行う:Creating new named variable in dataframe using loop and naming conventionに応じてループ内で同じことをやろうと

data<-data.frame(path=c("A/A/$/B/$/A/$","B/C/$","B/C/$/C/$/A/B/$"),stringsAsFactors=FALSE) 
library(stringr) 
data$tr<-str_count(data$path,"\\$") 
data$tr_1<-substr(sapply(strsplit(data$path, "\\$"), `[[`, 1),1,nchar(sapply(strsplit(data$path, "\\$"), `[[`, 1))-1) 
data$tr_2<-ifelse(is.na(sapply(strsplit(data$path, "\\$"), `[`, 2))==TRUE, 
        "", 
        paste0(data$tr_1,substr(sapply(strsplit(data$path, "\\$"), `[`, 2),1,nchar(sapply(strsplit(data$path, "\\$"), `[`, 2))-1))) 
data$tr_3<-ifelse(is.na(sapply(strsplit(data$path, "\\$"), `[`, 3))==TRUE, 
        "", 
        paste0(data$tr_2,substr(sapply(strsplit(data$path, "\\$"), `[`, 3),1,nchar(sapply(strsplit(data$path, "\\$"), `[`, 3))-1))) 

Doing it manually:

を、出力は失敗します。

data<-data[,-c(4,5)] 
for (i in 2:max(data$tr)) { 
    data[[paste0("tr_",i)]]<-ifelse(is.na(sapply(strsplit(data$path, "\\$"), `[`, i))==TRUE, 
        "", 
        paste0(data$tr_i-1,substr(sapply(strsplit(data$path, "\\$"), `[`, i),1,nchar(sapply(strsplit(data$path, "\\$"), `[`, i))-1))) 
} 

Doing it in a loop:

再帰的にそれを行うための別の方法はありますか? (それぞれの新しい変数は前の変数を使用します)。
ありがとうございます!

答えて

1

私はこれを行うだろう:あなたがしなければならない場合、あなたは別のlapplyループに空の文字列とNA値を置き換えることができます

data<-data.frame(path=c("A/A/$/B/$/A/$","B/C/$","B/C/$/C/$/A/B/$"),stringsAsFactors=FALSE) 

#split strings 
tmp <- strsplit(data$path, "/$", fixed = TRUE) #thanks to David 
data$tr <- lengths(tmp) 

#paste them together cumulatively 
tmp <- lapply(tmp, Reduce, f = paste0, accumulate = TRUE) 

#create data.frame 
tmp <- lapply(tmp, `length<-`, max(lengths(tmp))) 
tmp <- setNames(as.data.frame(do.call(rbind, tmp), stringsAsFactors = FALSE), 
       paste0("tr_", seq_len(max(data$tr)))) 

data <- cbind(data, tmp) 
#    path tr tr_1 tr_2  tr_3 
#1 A/A/$/B/$/A/$ 3 A/A A/A/B A/A/B/A 
#2   B/C/$ 1 B/C <NA>  <NA> 
#3 B/C/$/C/$/A/B/$ 3 B/C B/C/C B/C/C/A/B 

+0

ありがとう、ローランド。できます! –

関連する問題