147

B 以下にコード化された R データ フレームで、表示されるすべての時刻を に置き換えたいと思いますb

junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")

これにより以下が提供されます。

   nm val
1   A   a
2   B   b
3   C   c
4   D   d
5   A   e
6   B   f
7   C   g
8   D   h
9   A   i
10  B   j
11  C   k
12  D   l

私の最初の試みは、次のようなforandステートメントを使用することでした。if

for(i in junk$nm) if(i %in% "B") junk$nm <- "b"

しかし、ご覧のとおり、これにより のすべての値が に置き換えjunk$nmられbます。これがこれを行っている理由はわかりますが、元の値がB.

注:私はなんとか問題を解決しましgsubたが、RIを学ぶために、元のアプローチを機能させる方法を知りたいです(可能であれば)

4

10 に答える 10

248

nm を文字に変換してから変更する方が簡単です。

junk$nm <- as.character(junk$nm)
junk$nm[junk$nm == "B"] <- "b"

編集:そして、実際に nm を要因として維持する必要がある場合は、最後にこれを追加します:

junk$nm <- as.factor(junk$nm)
于 2011-04-28T20:11:04.490 に答える
47

値を置き換える別の便利な方法

library(plyr)
junk$nm <- revalue(junk$nm, c("B"="b"))
于 2013-12-14T16:27:03.313 に答える
29

簡単な答えは次のとおりです。

junk$nm[junk$nm %in% "B"] <- "b"

R イントロダクションのインデックス ベクトルを見てください(まだ読んでいない場合)。


編集。コメントで気づいたように、このソリューションは文字ベクトルに対して機能するため、データでは失敗します。

要因の最良の方法は、レベルを変更することです:

levels(junk$nm)[levels(junk$nm)=="B"] <- "b"
于 2011-04-28T20:03:38.517 に答える
21

あなたが示すデータは要因であるため、少し複雑になります。@diliop's Answer はnm、文字変数に変換することで問題に取り組みます。元の要因に戻るには、さらに手順が必要です。

別の方法は、その場で因子のレベルを操作することです。

> lev <- with(junk, levels(nm))
> lev[lev == "B"] <- "b"
> junk2 <- within(junk, levels(nm) <- lev)
> junk2
   nm val
1   A   a
2   b   b
3   C   c
4   D   d
5   A   e
6   b   f
7   C   g
8   D   h
9   A   i
10  b   j
11  C   k
12  D   l

これは非常に単純で、 の代わりとなる関数があることを忘れがちですlevels()

編集:コメントで@Sethが指摘したように、これは明快さを失うことなくワンライナーで行うことができます:

within(junk, levels(nm)[levels(nm) == "B"] <- "b")
于 2011-04-28T20:36:14.840 に答える
12

1 つのコマンドでこれを行う最も簡単な方法は、 command を使用することです。whichまた、次のようにして要素を文字に変更する必要はありません。

junk$nm[which(junk$nm=="B")]<-"b"
于 2012-01-07T13:26:03.543 に答える
5

You have created a factor variable in nm so you either need to avoid doing so or add an additional level to the factor attributes. You should also avoid using <- in the arguments to data.frame()

Option 1:

junk <- data.frame(x = rep(LETTERS[1:4], 3), y =letters[1:12], stringsAsFactors=FALSE)
junk$nm[junk$nm == "B"] <- "b"

Option 2:

levels(junk$nm) <- c(levels(junk$nm), "b")
junk$nm[junk$nm == "B"] <- "b"
junk
于 2011-04-28T20:18:39.363 に答える
2

あなたも使うことができますifelse。これは非常に理解しやすいです

junk$val <- ifelse(junk$nm == "B", "b", junk$val)

それでもfor loop正しい方法でやりたい場合

for(i in 1:nrow(junk)){
  if(junk[i, "nm"] == "B"){
    junk[i, "val"] <- "b"
  }
}

junk
> junk
   nm val
1   A   a
2   B   b
3   C   c
4   D   d
5   A   e
6   B   b
7   C   g
8   D   h
9   A   i
10  B   b
11  C   k
12  D   l
于 2021-03-31T05:07:13.757 に答える
0
stata.replace<-function(data,replacevar,replacevalue,ifs) {
  ifs=parse(text=ifs)
  yy=as.numeric(eval(ifs,data,parent.frame()))
  x=sum(yy)
  data=cbind(data,yy)
  data[yy==1,replacevar]=replacevalue
  message=noquote(paste0(x, " replacement are made"))
  print(message)
  return(data[,1:(ncol(data)-1)])
}

以下の行を使用してこの関数を呼び出します。

d=stata.replace(d,"under20",1,"age<20")
于 2019-04-08T06:47:29.930 に答える