2

過去数時間解決しようとして失敗した別の質問があります。これには、R でのデータセット操作が含まれます。次のサンプル データセットがあるとします。

a,b,v,r
1,3,1,0
2,5,1,1
3,6,0,1
1,5,1,0
2,4,1,1
3,6,0,1

次のルールで列 [v,r] の値を比較して、3 番目の列 (たとえば m) を作成する必要があります。v = 1、r = 0 の場合、m = 0。v = 1、r = 1 の場合、m = 1、v = 0、r = 1 の場合、m = 2。[v,r] は、値 (0,0)。

どうすれば 3 番目の列を作成し、列 v,r を 1 行で削除できるのでしょうか。ありがとうございました !

4

3 に答える 3

5

data.table(1.8.8)を使用:

DT <- data.table(DF)
DT[, `:=`(m = (!v) * 1 + r, v = NULL, r=NULL)]
#    a b m
# 1: 1 3 0
# 2: 2 5 1
# 3: 3 6 2
# 4: 1 5 0
# 5: 2 4 1
# 6: 3 6 2
于 2013-03-19T07:23:47.483 に答える
3

これは1行ではありません(@Arunのソリューションほどきびきびとは言えません)が、 anddata.tableを使用した1つのアプローチを次に示します。withinifelse

within(mydf, {
  m <- ifelse(v == 1 & r == 0, 0, ifelse(v == 1 & r == 1, 1, 2))
  rm(v, r)
})
#   a b m
# 1 1 3 0
# 2 2 5 1
# 3 3 6 2
# 4 1 5 0
# 5 2 4 1
# 6 3 6 2
于 2013-03-19T07:31:22.960 に答える
2

パッケージtransformからの使用base

DF <- read.csv(textConnection("a,b,v,r\n1,3,1,0\n2,5,1,1\n3,6,0,1\n1,5,1,0\n2,4,1,1\n3,6,0,1"), header = TRUE)

transform(DF, m = (!v) * 1 + r, v = NULL, r = NULL)
##   a b m
## 1 1 3 0
## 2 2 5 1
## 3 3 6 2
## 4 1 5 0
## 5 2 4 1
## 6 3 6 2
于 2013-03-19T07:36:32.673 に答える