1

(今日の 2 番目の質問 - 悪い日になるはずです)

濃度列(数値)、無効な結果を強調表示するフラグ(ブール値)、問題の説明(文字)など、さまざまな列を持つデータフレームがあります

df <- structure(list(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), rawconc = c(77.4, 
52.6, 86.5, 44.5, 167, 16.2, 59.3, 123, 1.95, 181), reason = structure(c(NA, 
NA, 2L, NA, NA, NA, 2L, 1L, NA, NA), .Label = c("Fails Acceptance Criteria", 
"Poor Injection"), class = "factor"), flag = c("False", "False", 
"True", "False", "False", "False", "True", "True", "False", "False"
)), .Names = c("x", "rawconc", "reason", "flag"), row.names = c(NA, 
-10L), class = "data.frame")

理由列の数値レベルで列を作成できます

df$level<-as.numeric(df$reason)
df
    x rawconc                    reason  flag level
1   1   77.40                      <NA> False    NA
2   2   52.60                      <NA> False    NA
3   3   86.50            Poor Injection  True     2
4   4   44.50                      <NA> False    NA
5   5  167.00                      <NA> False    NA
6   6   16.20                      <NA> False    NA
7   7   59.30            Poor Injection  True     2
8   8  123.00 Fails Acceptance Criteria  True     1
9   9    1.95                      <NA> False    NA
10 10  181.00                      <NA> False    NA

そして、これが「レベル」の多くの星を持つ列を作成するためにやりたいことですが、失敗します

df$stars<-paste(rep("*",df$level)sep="",collapse="")
Error: unexpected symbol in "df$stars<-paste(rep("*",df$level)sep"

df$stars<-paste(rep("*",df$level),sep="",collapse="")
Error in rep("*", df$level) : invalid 'times' argument

rep("*",df$level)
Error in rep("*", df$level) : invalid 'times' argument

df$stars<-paste(rep("*",pmax(df$level,0,na.rm=TRUE)),sep="",collapse="")
Error in rep("*", pmax(df$level, 0, na.rm = TRUE)) : 
  invalid 'times' argument

rep には一度に 1 つの値を入力する必要があるようです。私はこれが可能であるべきだと感じています(そして、私の腸は「ラップリーを使用してください」と言っていますが、私の適用fuはv.貧弱です)

試してみたい人はいますか?

4

2 に答える 2

3

次のように星のベクトルを作成できます

vstars <- sapply(1L:nlevels(df$reason), function(i) paste(rep("*",i),collapse=""))
vstars
# [1] "*"  "**"

そして、それをインデックス化しますdf$reason(これは要因であるため機能します):

vstars[df$reason]
# [1] NA   NA   "**" NA   NA   NA   "**" "*"  NA   NA

大規模な場合は、各行data.frameよりもはるかに高速になるはずです。paste

于 2010-04-06T15:44:04.680 に答える
2

適用型の関数が必要になると思います。これはうまくいきます:

df[is.na(df$level),"level"] <- 0
df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))

リストの代わりにベクトルを返すため、このインスタンスsapplyよりも使用する方が適切です。lapply

担当者のヘルプから:

'times' が単一の整数で構成される場合、結果は入力全体がこの回数だけ繰り返されます。「times」が「x」と同じ長さのベクトルである場合 (「each」による複製後)、結果は「x[1]」が「times[1]」回繰り返され、「x[2]」が繰り返されます。 「回[2]」回など。

times パラメーターにベクトルを使用する際の問題の 1 つrepは、ベクトルを返すだけで、times=0 の場合にインスタンスを破棄することです。これは、次のコマンドで確認できますrep(rep("*", nrow(df)), times=df$level)

于 2010-04-06T14:35:46.357 に答える