2016-10-04 69 views
-1

数据帧通过函数中的R改变在一个数据帧的可变值

df<-structure(list(V1 = c(1L, 2L, 2L, 3L, 2L), V2 = c(1L, 3L, 3L, 
1L, 2L), V3 = c(2L, 2L, 1L, 2L, 3L)), .Names = c("V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -5L)) 

问题

要编写改变可变成一个函数: 甲如果变量是1 B如果变量为2 C如果变量为3

Wh在我试过

我写了一个函数,但不知何故它无法更新函数外的值。如果我直接运行它,它可以工作。

test_recode<-function(x){ 
     require("memisc") 
     x<-cases("A"<-x==1, 
       "B"<-x==2, 
       "C"<-x==3)} 
test_recode(df$V1) 

该函数运行时没有错误,但数据帧仍未更改。

但是,它运行良好,没有这个功能。

df$V1<-cases("A"<-df$V1==1, 
      "B"<-df$V1==2, 
      "C"<-df$V1==3) 

进一步意见

我做了一些研究,发现它与<的事 - 和< < - 但是当我改变X < - 为x < < - 它赋值为x从字面上。我怎么能告诉函数将值分配给我指定为参数的变量?

另外,我需要坚持使用memisccases函数。

+1

'之开关是你需要的功能:'$ DF V1 < - sapply(DF $ (关于你的函数,你需要返回一些东西:'return(x)') – Cath

+1

然后,你还需要分配结果, 'df $ V1 <-test_recode(df $ V1)'。 – mtoto

+0

@moto:但我已经完成了我的功能: –

回答

1

一个非常简单的方法是这样的:

apply(df, 2, function(x) chartr("123", "ABC", x)) 

#  V1 V2 V3 
#[1,] "A" "A" "B" 
#[2,] "B" "C" "B" 
#[3,] "B" "C" "A" 
#[4,] "C" "A" "B" 
#[5,] "B" "B" "C" 
+0

我不确定这是否需要应用于每个列,但除了非常聪明的选项:-) – Cath

0

使用LETTERS另一种可能性,

sapply(df, function(i) LETTERS[i]) 
#  V1 V2 V3 
#[1,] "A" "A" "B" 
#[2,] "B" "C" "B" 
#[3,] "B" "C" "A" 
#[4,] "C" "A" "B" 
#[5,] "B" "B" "C" 
+0

我也这么想。但是你永远不知道,如果这一行直线前进,或者如果4可能是“K”;-)。 –

+0

@J_F来吧,4永远不会是'K'... :)你说得对,虽然理论上不能很普遍 – Sotos

相关问题