1

入力ファイルのいくつかの文字列を処理しようとしています。最初に文字列をベクトルからリストに変換し、次に一意の値のみに減らします。

次に、各リスト要素の単語を「:1」の区切り文字で文字列に変換します。

関数を単一のリスト要素で機能させることはできますが、ldplyfromplyrを使用してリスト全体で機能させようとすると、各リスト要素の最後の単語しか取得できません。

コードは次のとおりです。

library(plyr)

df1 <- data.frame(id = seq(1,5,1), string1 = NA)
head(df1)
df1$string1[1] <- "This string is a string."
df1$string1[2] <- "This string is a slightly longer string."
df1$string1[3] <- "This string is an even longer string."
df1$string1[4] <- "This string is a slightly shorter string."
df1$string1[5] <- "This string is the longest string of all the other strings."

df1$string1 <- tolower(as.character(df1$string1))
df1$string1 <- gsub('[[:punct:]]',' ',df1$string1)
df1$string1 <- gsub('[[:digit:]]',' ',df1$string1)
df1$string1 <- gsub("\\s+"," ",df1$string1)

fdList1 <- strsplit(df1$string1, " ", df1$string1)
fdList2 <- lapply(fdList1, unique)

toString1 <- function(x){
string2 <- c()
#print(length(x[1][1]))
#print(x)
#print(class(x))
for(i in length(x)){
string2 <- paste0(string2, x[[i]], ":1 ", collapse="")
}
string2
}

df2 <- ldply(fdList2, toString1)
df2 

v1 <- toString1(fdList2[2])
v1

df2v1間違っています。各リスト要素に似たベクトルが必要です。

助言がありますか?

4

2 に答える 2

3

これが起こっている理由を説明するには:

あなたの機能toString1が問題です:

toString1 <- function(x) {
    string2 <- c()
    for(i in length(x)) { 
        string2 <- paste0(string2, x[[i]], ":1 ", collapse="")
    }
    string2
}

の場合toString1(fdList2[1])、リストを渡します。したがって、の使用はありませんfor-loop。関数が次の場合に機能します。

toString1 <- function(x) {
    string2 <- paste0(x[[1]], ":1 ", collapse="")
}
o <- toString1(fdList2[2])

# [1] "this:1 string:1 is:1 a:1 slightly:1 longer:1 "

しかし、そうするときldply、渡すのはリスト(fdList2[2])ではなく、ベクトル(fdList2[[2]])です。したがって、この場合、関数は次のようになります。

toString1 <- function(x) {
    string2 <- c()
    for(i in 1:length(x)) { 
        string2 <- paste0(string2, x[i], ":1 ", collapse="")
    }
    string2
}
ldply(fdList2, toString1)

#                                                                   V1
# 1                                          this:1 string:1 is:1 a:1 
# 2                      this:1 string:1 is:1 a:1 slightly:1 longer:1 
# 3                         this:1 string:1 is:1 an:1 even:1 longer:1 
# 4                     this:1 string:1 is:1 a:1 slightly:1 shorter:1 
# 5 this:1 string:1 is:1 the:1 longest:1 of:1 all:1 other:1 strings:1 

length(x)forループ内のが、1:length(x)すべての要素を循環する必要があるため、およびベクトルであるためにに変更されていることx[[i]]x[i]注意してください。

お役に立てれば。

于 2013-03-04T19:03:36.140 に答える
2

sapply「fdList2」だけで使ってみませんか?

> sapply(fdList2, paste0, ":1 ", collapse = "")
[1] "this:1 string:1 is:1 a:1 "                                         
[2] "this:1 string:1 is:1 a:1 slightly:1 longer:1 "                     
[3] "this:1 string:1 is:1 an:1 even:1 longer:1 "                        
[4] "this:1 string:1 is:1 a:1 slightly:1 shorter:1 "                    
[5] "this:1 string:1 is:1 the:1 longest:1 of:1 all:1 other:1 strings:1 "
> ## If you need a single column data.frame
> data.frame(V1 = sapply(fdList2, paste0, ":1 ", collapse = ""))
                                                                  V1
1                                          this:1 string:1 is:1 a:1 
2                      this:1 string:1 is:1 a:1 slightly:1 longer:1 
3                         this:1 string:1 is:1 an:1 even:1 longer:1 
4                     this:1 string:1 is:1 a:1 slightly:1 shorter:1 
5 this:1 string:1 is:1 the:1 longest:1 of:1 all:1 other:1 strings:1 

さらに言えば、これが本当にあなたの目標である場合、あなたはあなたの中間ステップをさらに単純化することができます。「fdList1」と「fdList2」の作成をスキップして、次を使用します。

sapply(strsplit(df1$string1, " "), 
       function(x) paste0(unique(x), ":1 ", collapse = ""))
于 2013-03-04T19:00:46.953 に答える