2017-10-11 1 views
1

これは基本的な質問ですが、私は尋ねるのが恥ずかしいです。デリミタ付き文字列をデータフレーム内の数値ベクトルに変換してください

のは、私は次のような形式のデータを含む列の完全なデータフレームを持っているとしましょう:

test <-"3000,9843,9291,2161,3458,2347,22925,55836,2890,2824,2848,2805,2808,2775,2760,2706,2727,2688,2727,2658,2654,2588" 

私はそうのように行っている数値ベクトル、これを変換したい:

test <- as.numeric(unlist(strsplit(test, split=","))) 

このデータでいっぱいの大きなデータフレームを数値ベクトルに変換したいと考えています:

mutate(data, 
    converted = as.numeric(unlist(strsplit(badColumn, split=","))), 
) 

これはおそらく、それが数値ベクトルに列全体を変換し、その値を持つ単一の行を置き換えているため動作しません:

Error in mutate_impl(.data, dots) : Column converted must be length 20 (the number of rows) or one, not 1274

は、私はこれをどのように行うのですか?

+0

分割後、列が長すぎます。あなたのデータは20行しか持っていないようですが、分割カラムには1274要素があります。データの新しい列(mutateと同じ)に割り当てる必要がなければ、 'as.numeric(unlist(strsplit(data $ badColumn、split ="、 ")))' –

+0

私は理解していますが、なぜそれが当てはまるのか混乱しています。現在の行には「10,20,30,40」のような値が含まれています。これらの値をc(10、20、30、40)の数値ベクトルに置き換えてください。 – Parseltongue

+0

ある行に複数の数値が必要なのですか?例えば。行1は 'c(10,20,30)'を持っていますか? –

答えて

1

はあなたのエラーを再現するいくつかのサンプルデータです:

data <- data.frame(a = 1:3, 
        badColumn = c("10,20,30,40,50", "1,2,3,4,5,6", "9,8,7,6,5,4,3"), 
        stringsAsFactors = FALSE) 

はここでエラーです:

library(tidyverse) 
mutate(data, converted = as.numeric(unlist(strsplit(badColumn, split=",")))) 
# Error in mutate_impl(.data, dots) : 
# Column `converted` must be length 3 (the number of rows) or one, not 18 

簡単な方法は、単に全体の列、およびlapplystrsplitを使用することです... as.numericを使用して、結果のリスト値を文字ベクトルから数値ベクトルに変換します。

x <- mutate(data, converted = lapply(strsplit(badColumn, ",", TRUE), as.numeric)) 
str(x) 
# 'data.frame': 3 obs. of 3 variables: 
# $ a  : int 1 2 3 
# $ badColumn: chr "10,20,30,40,50" "1,2,3,4,5,6" "9,8,7,6,5,4,3" 
# $ converted:List of 3 
# ..$ : num 10 20 30 40 50 
# ..$ : num 1 2 3 4 5 6 
# ..$ : num 9 8 7 6 5 4 3 
1

ベースR

A=c(as.numeric(strsplit(test,',')[[1]])) 

A 
[1] 3000 9843 9291 2161 3458 2347 22925 55836 2890 2824 2848 2805 2808 2775 2760 2706 2727 2688 2727 2658 2654 2588 


df$NEw2=lapply(df$NEw, function(x) c(as.numeric(strsplit(x,',')[[1]]))) 

df%>%mutate(NEw2=list(c(as.numeric(strsplit(NEw,',')[[1]])))) 
+0

これは私がすでに持っていた機能を複製するだけです。私の問題は物理的に(現在の文字列を含む)データフレームの列を数字のベクトルに相当するものに置き換えることです – Parseltongue

+0

@Parseltongue更新を確認 – Wen

2

これは役立つかもしれない:

library(purrr) 

mutate(data, converted = map(badColumn, function(txt) as.numeric(unlist(strsplit(txt, split = ","))))) 

をあなたは何を得る数値ベクトルを含むリスト列です。ここで

+0

はい、そうです。私は私の答えを編集しました。 – kath

+0

これは良い答えです - kathに感謝します。私はA5sの回答を受け入れています。 – Parseltongue

関連する問題