-2

生データをテキスト ファイルからマトリックスに変換しようとしています。を使用してデータを読み取り、データreadLines()grepl()(つまり male;20;30.5 => "male" "20" "30.5") でリストに分割しました。

唯一のことは、性別、年齢、または体重が記録されていないか、小数点の代わりにコンマが使用されているいくつかの値がデータに欠落していることです。これらの場合、データ リストには次のような行が含まれます。

##"male"    "20"   "55.3"
##"male" "45" 

また

##"" "55" "55"

を追加してこれらのインスタンスを修正する関数を適用したいと思いますNA。次に、その関数を に適用しますlapply(data.dataList, function)Rの関数は私の強みではありませんが、これが私の最初の試みです。

# function to correct column order for weight data
f.assignFields <- function(x) {
# create a blank character vector of length 3
out <- character(3)
sex <- grepl("[[:alpha:]]",x)
out[1] <- x[sex]
age.num <- which(as.numeric(x) <0)
out[2] <- ifelse(length(length(age.num) > 0, x[age.num], NA)
weight.num <- which(as.numeric(x) > 0)
out[3] <- ifelse(length(weight.num) > 0, x[weight.num], NA)
out
}

data.standardFields <- lapply(data.dataList, fassignFields)

最初の列に文字を含む文字列を配置し、2 番目と 4 番目の列に他の文字列を配置したいことはわかっています。また、「、」を「。」に置き換える必要があります。適用前または適用後の重みlapply()? 正しい方向に少しだけ微調整していただければ幸いです。

編集: テキスト ファイルから描画されるデータは非常に小さいです。性別、年齢、体重を記録しているのは 9 人だけです。演習のポイントは、生データを使用してデータを変更および変換し、データを自分で変更することの有用性を調べることでしたread.table()。.

male;28;81.3
male;45;
female; 17 ;57,2
female;64;62.8
male;16;55.3
male;;50,1
female;20.4;55
female;;
;55;55

これが私がしたことです:

#read text file
weight.data <- readLines(text.txt)         

#removed white spaces
weight.data <- gsub(" ","",weight.data)
weight.data

[1] "male;28;81.3"     
[2] "male;45;"      
[3] "female;17;57,2"
[4] "female;64;62.8"  
[5] "male;16;55.3"   
[6] "male;;50,1"       
[7] "female;20.4;55"     
[8] "female;;"          
[9] ";55;55" 

#split strings by semicolon
weight.dataList <-strsplit(weight.data, split = ";")
weight.dataList

[[1]]
[1] "male"    "28"   "81.3"

[[2]]
[1] "male" "45"  

[[3]]
[1] "female" "17"     "57,2"  

[[4]]
[1] "female" "64"   "62.8"

[[5]]
[1] "male"  "16"   "55.3"

[[6]]
[1] "male"    ""     "50,1"

[[7]]
[1] "female"    "20.4" "55"  

[[8]]
[1] "female" ""  

[[9]]
[1] ""   "55" "55"

欠落している行に NA を追加したい。フィールドの行の寸法を修正する関数を作成しようとしています。たとえば、2 番目のエントリには、重みの NA が必要です。

# function to correct column order and size for weight data
f.assignFields <- function(x) {
# create a blank character vector of length 3
out <- character(3)
sex <- grepl("[[:alpha:]]",x)
# puts sex in first column
out[1] <- x[sex]
# assigns NA if age missing
age.num <- which(as.numeric(x) <0)
out[2] <- ifelse(length(length(age.num) > 0, x[age.num], NA)
# assigns NA if weight missing
weight.num <- which(as.numeric(x) > 0)
out[3] <- ifelse(length(weight.num) > 0, x[weight.num], NA)
out
}

data.standardFields <- lapply(data.dataList, fassignFields)

最後にunlist()andを使用しmatrix()て、データを行と列の形式に変換します。データの欠損値を NA に置き換え、データを「性別、年齢、体重」の順に並べ、55,1 が 55.1 と表示されるように重みを修正します。

4

1 に答える 1

0

最も簡単な方法は を使用するread.tableことですが、教授があなたを苦しめようとしているようです。人の年齢として 20.4 がリストされているデータセットはどこにもありません。

> ## txt <- "male;28;81.3
  ## male;45;
  ## female; 17 ;57,2
  ## female;64;62.8
  ## male;16;55.3
  ## male;;50,1
  ## female;20.4;55
  ## female;;
  ## ;55;55"
> x <- gsub("\\s+", "", readLines(textConnection(txt))) 
> rpl.comma <- gsub(",", ".", x)
> spl <- strsplit(rpl.comma, ";")
> M <- matrix(0, nrow = length(x), ncol = 3)
> for(j in 1:3){
    M[,j] <- sapply(seq(spl), function(i){
      ifelse(spl[[i]][j] == "", "NA", spl[[i]][j])
    })
  }
> DF <- data.frame(M)
> names(DF) <- c("sex", "age", "weight")
> DF
##      sex  age weight
## 1   male   28   81.3
## 2   male   45   <NA>
## 3 female   17   57.2
## 4 female   64   62.8
## 5   male   16   55.3
## 6   male   NA   50.1
## 7 female 20.4     55
## 8 female   NA   <NA>
## 9     NA   55     55
于 2014-05-03T23:09:05.410 に答える