1

4 列の値を持つ .csv があります。

data<-read.csv("C:\\Users\\mtatange\\Desktop\\Dataset.csv")
A         B        C        D   
1         1       NA        1   
2         2        4        1   
3         3        6        4   
4        NA        8        5

data$E<-do.call(paste,c(data[c("A","B","C","D")], sep=""))
data
A         B        C        D       E        
1         1       NA        1      11NA1 
2         2        4        1      2241
3         3        6        4      3364 
4        NA        8        5      4NA85

summary(data)
E
Length: 4
Class: Character
Mode: Character

列 "E" をベクトルにする必要があります。文字変数のままにすることはできません。私は試した:

data$E[is.na(a$E)]<-0

しかし、それでも列は文字変数として残りました。列をベクトル変数に変換するにはどうすればよいですか?

4

1 に答える 1

2

NAの最初のものを取り除く..:

df[ is.na(df) ] <- 0
df$E <- apply(df,1,function(x) as.numeric(paste0(x , collapse="")))
  A B C D    E
1 1 1 0 1 1101
2 2 2 4 1 2241
3 3 3 6 4 3364
4 4 0 8 5 4085

apply(df , 2 , class )
        A         B         C         D         E 
"numeric" "numeric" "numeric" "numeric" "numeric" 

上記の解決策はあなたにアイデアを与えます。あるいは、これを行う (比較的) 高速な方法は次のとおりです。

df[ is.na(df) ] <- 0
df$E <- as.numeric(do.call(paste0, df))

そしてNAの交換は非常に高速です。MBPラップトップで300,000行の3列テーブルのテストで...

df <- data.frame( a = sample(c(1:9,NA) , 3e5 , repl = TRUE ) , b = sample(c(1:9,NA) , 3e5 , repl = TRUE ) , c = sample(c(1:9,NA) , 3e5 , repl = TRUE )  )   
sum(is.na(df))
[1] 90118

system.time( (df[is.na(df)] <- 0 ) )
  user  system elapsed 
 0.250   0.021   0.269 
nrow(df)
 [1] 300000
于 2013-04-23T14:01:47.460 に答える