0

こんにちは、いくつかの行のリストとして複数の値を含むデータフレームがあります。

var1
A8
A9
c("A1", "A1", "D3")
c("A1", "D1")
c("D1", "D1")
c("D2", "A2")
c("D5", "A1")

最初の観察を維持することにより、複数の値を持つ行を「リストから外す」ことを試みています。unlist コマンドを試してみましたが、うまくいきませんでした。このタスクを達成する最も簡単な方法は何ですか。

4

1 に答える 1

0

コメントに示されているように、列は最初にを使用characterして現在のクラスからクラス に強制 (変換) する必要があります。factoras.character

これは、パラメーターを使用してファイル読み取り段階で回避できます。stringsAsFactors=FALSE

各行を分割して最初の値のみを保持するには、次のようにします。

copyDF$Var1 = sapply(strsplit(copyDF$Var1,","),head,1)

これが機能するかどうかお知らせください:

#user input data with factor class
userDF = structure(list(Var1 = structure(1:6, .Label = c("", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "c(\"B1\", \"B1\")", "c(\"B3\", \"B4\")", "c(\"B4\", \"B2\")"), class = "factor"), Freq = c(2538L, 633L, 458L, 328L, 135L, 56L)), .Names = c("Var1", "Freq"), row.names = c(NA, 6L), class = "data.frame")
userDF
#  Var1 Freq
#1      2538
#2   B1  633
#3   B2  458
#4   B3  328
#5   B4  135
#6   B5   56

str(userDF)
#   'data.frame':   6 obs. of  2 variables:
#$ Var1: Factor w/ 12 levels "","B1","B2","B3",..: 1 2 3 4 5 6
#$ Freq: int  2538 633 458 328 135 56

#Since userDF had no multiple values, adding them here
newDF = structure(list(Var1 = structure(1:6, .Label = c("B1,B2,B3", "B4,B5", "B6,B7,B8", "B3", "B4", "B5", "B6", "B7", "B8", "c(\"B1\", \"B1\")", "c(\"B3\", \"B4\")", "c(\"B4\", \"B2\")"), class = "factor"), Freq = c(2538L, 633L, 458L, 328L, 135L, 56L)), .Names = c("Var1", "Freq"), row.names = c(NA, 6L), class = "data.frame")
newDF
#      Var1 Freq
#1 B1,B2,B3 2538
#2    B4,B5  633
#3 B6,B7,B8  458
#4       B3  328
#5       B4  135
#6       B5   56


#Make a copy of the dataset
copyDF = newDF

#Var1 is of class factor which is not amenable for string operations,hence convert to character class
copyDF$Var1 = as.character(copyDF$Var1)

#Split each row, unlist and retain only first value

copyDF$Var1 = sapply(strsplit(copyDF$Var1,","),head,1)

copyDF
#  Var1 Freq
#1   B1 2538
#2   B4  633
#3   B6  458
#4   B3  328
#5   B4  135
#6   B5   56
于 2016-08-22T13:08:38.627 に答える