R 在数据帧上应用函数
R applying function on a dataframe
我正在尝试应用此功能:
if.class <- function(data){
as.data.frame(
if (data == '[1, 4)') '1'
else if (data == '[4, 6)') '2'
else '3'
)
}
在整个数据帧上,以便将因子级别 [1, 4) 和 [4, 6) 转换为 1 或 2 或 3。
数据框如下所示:
> dim(mnm.predict.test.class)
[1] 5750 1
> head(mnm.predict.test.class)
predict(mnm, newdata = testing.logist, type = "class")
1 [1, 4)
2 [1, 4)
3 [1, 4)
4 [1, 4)
5 [1, 4)
6 [1, 4)
我正在使用这一行进行转换:
mnm.predict.test.class.factors <- apply(mnm.predict.test.class,c(1,2),if.class)
然而,结果很奇怪:
head(mnm.predict.test.class.factors)
predict(mnm, newdata = testing.logist, type = "class")
[1,] List,1
[2,] List,1
[3,] List,1
[4,] List,1
[5,] List,1
[6,] List,1
知道为什么转换没有按预期工作吗?
您可以使用 levels
函数来改变 factor
的级别。例如,如果您有因子变量 foo
foo <- factor(
rep(c("[1, 4)","[4, 6)","[6, 7)","[7, 9)"),2))
R> foo
[1] [1, 4) [4, 6) [6, 7) [7, 9) [1, 4) [4, 6) [6, 7) [7, 9)
Levels: [1, 4) [4, 6) [6, 7) [7, 9)
您可以像这样更改级别
levels(foo) <- c("1","2","3","3")
R> foo
[1] 1 2 3 3 1 2 3 3
Levels: 1 2 3
在你的例子中,你有 1 列 data.frame
,所以它类似于
Df <- data.frame(
foo = factor(
rep(c("[1, 4)","[4, 6)",
"[6, 7)","[7, 9)"),2)))
##
levels(Df[,1]) <- c("1","2","3","3")
R> str(Df)
'data.frame': 8 obs. of 1 variable:
$ foo: Factor w/ 3 levels "1","2","3": 1 2 3 3 1 2 3 3
作为旁注,根据问题中 head(mnm.predict.test.class.factors)
的输出判断,您的一列的名称似乎很笨拙 predict(mnm, newdata = testing.logist, type = "class")
- 您可能想将其更改为其他名称打字更合理(例如names(mnm.predict.test.class.factors)[1] <- "myVar"
)。
apply
returns 和 array
以及您的输出。将其转换为 data.frame
就可以了:
#example data
df <- data.frame(a=rep('[1, 4)',50) )
> df
a
1 [1, 4)
2 [1, 4)
3 [1, 4)
4 [1, 4)
5 [1, 4)
6 [1, 4)
7 [1, 4)
8 [1, 4)
9 [1, 4)
#just use your function as you used it but wrapped inside a data.frame function
df2 <- data.frame(apply(df,c(1,2),if.class))
> df2
a
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
我正在尝试应用此功能:
if.class <- function(data){
as.data.frame(
if (data == '[1, 4)') '1'
else if (data == '[4, 6)') '2'
else '3'
)
}
在整个数据帧上,以便将因子级别 [1, 4) 和 [4, 6) 转换为 1 或 2 或 3。 数据框如下所示:
> dim(mnm.predict.test.class)
[1] 5750 1
> head(mnm.predict.test.class)
predict(mnm, newdata = testing.logist, type = "class")
1 [1, 4)
2 [1, 4)
3 [1, 4)
4 [1, 4)
5 [1, 4)
6 [1, 4)
我正在使用这一行进行转换:
mnm.predict.test.class.factors <- apply(mnm.predict.test.class,c(1,2),if.class)
然而,结果很奇怪:
head(mnm.predict.test.class.factors)
predict(mnm, newdata = testing.logist, type = "class")
[1,] List,1
[2,] List,1
[3,] List,1
[4,] List,1
[5,] List,1
[6,] List,1
知道为什么转换没有按预期工作吗?
您可以使用 levels
函数来改变 factor
的级别。例如,如果您有因子变量 foo
foo <- factor(
rep(c("[1, 4)","[4, 6)","[6, 7)","[7, 9)"),2))
R> foo
[1] [1, 4) [4, 6) [6, 7) [7, 9) [1, 4) [4, 6) [6, 7) [7, 9)
Levels: [1, 4) [4, 6) [6, 7) [7, 9)
您可以像这样更改级别
levels(foo) <- c("1","2","3","3")
R> foo
[1] 1 2 3 3 1 2 3 3
Levels: 1 2 3
在你的例子中,你有 1 列 data.frame
,所以它类似于
Df <- data.frame(
foo = factor(
rep(c("[1, 4)","[4, 6)",
"[6, 7)","[7, 9)"),2)))
##
levels(Df[,1]) <- c("1","2","3","3")
R> str(Df)
'data.frame': 8 obs. of 1 variable:
$ foo: Factor w/ 3 levels "1","2","3": 1 2 3 3 1 2 3 3
作为旁注,根据问题中 head(mnm.predict.test.class.factors)
的输出判断,您的一列的名称似乎很笨拙 predict(mnm, newdata = testing.logist, type = "class")
- 您可能想将其更改为其他名称打字更合理(例如names(mnm.predict.test.class.factors)[1] <- "myVar"
)。
apply
returns 和 array
以及您的输出。将其转换为 data.frame
就可以了:
#example data
df <- data.frame(a=rep('[1, 4)',50) )
> df
a
1 [1, 4)
2 [1, 4)
3 [1, 4)
4 [1, 4)
5 [1, 4)
6 [1, 4)
7 [1, 4)
8 [1, 4)
9 [1, 4)
#just use your function as you used it but wrapped inside a data.frame function
df2 <- data.frame(apply(df,c(1,2),if.class))
> df2
a
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1