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 回答