R 如何向矩阵中添加3列,它们是自定义函数的值

R 如何向矩阵中添加3列,它们是自定义函数的值,r,R,假设我写了一个函数 group=function(x){if (x<=8) {o=1} else if (x<=11) {o=2} else o=3; return(o)} 现在,我想向矩阵中添加3列(第6列、第7列和第8列)。第6列和第7列是第2列和第3列的函数组的值,第8列用于标记组的更改。也就是说,我想得到: [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 6 11 16 21 1

假设我写了一个函数

group=function(x){if (x<=8) {o=1} 
else if (x<=11) {o=2} 
else o=3; 
return(o)}
现在,我想向矩阵中添加3列(第6列、第7列和第8列)。第6列和第7列是第2列和第3列的函数
组的值,第8列用于标记组的更改。也就是说,我想得到:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    6   11   16   21    1    2   12 #6<8 so column 6 is 1, 11<=11 so column 7 is 2; it changes from group 1 to 2, so column 8 is 12
[2,]    2    7   12   17   22    1    3   13
[3,]    3    8   13   18   23    1    3   13
[4,]    4    9   14   19   24    2    3   23
[5,]    5   10   15   20   25    2    3   23
但它说了下面的内容,但没有起作用

Warning messages:
1: In if (x == 0) { :
  the condition has length > 1 and only the first element will be used
我也试着使用下面的方法,但也不起作用

test2=cbind(test, apply(test[,2:3],1,group))
那么我应该使用哪个函数呢?另外,对于第8列,我们有这样一个函数吗?谢谢大家!


另外,我试图用R来计算马尔可夫转移矩阵,不确定我的方法是否是最简洁的方法…

正如@Christoph所建议的,你可以使用嵌套的
ifelse

cbind(test, ifelse(test[, 2:3] <= 8, 1,ifelse(test[, 2:3] <= 11, 2, 3)))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    1    6   11   16   21    1    2
#[2,]    2    7   12   17   22    1    3
#[3,]    3    8   13   18   23    1    3
#[4,]    4    9   14   19   24    2    3
#[5,]    5   10   15   20   25    2    3

cbind(test,ifelse)(test[,2:3]根据@Christoph的建议,您可以使用嵌套的
ifelse

cbind(test, ifelse(test[, 2:3] <= 8, 1,ifelse(test[, 2:3] <= 11, 2, 3)))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    1    6   11   16   21    1    2
#[2,]    2    7   12   17   22    1    3
#[3,]    3    8   13   18   23    1    3
#[4,]    4    9   14   19   24    2    3
#[5,]    5   10   15   20   25    2    3

cbind(test,if else)(test[,2:3]你应该用
cut
来代替
tt@rawr-或者用一个疯狂的行
cbind(test,`[如果有一个疯狂的,那应该是@thelatemailThank you@rawr。我以前不知道
cut
)@Natalia-
Inf
是“无限”-参见
?Inf
-它只意味着低于8到负无穷大的任何东西都会进入第一组,高于11到无穷大的任何东西都会进入最后一组。
`[你应该使用
cut
而不是
tt@rawr-或一条疯狂的线
cbind(测试`[如果有一个疯狂的例子,那就是@TheLate MailThank you@rawr.我以前不知道
cut
)@Natalia-
Inf
是“无穷大”-参见
?Inf
-它只意味着低于8到负无穷大的任何东西都会进入第一组,高于11到无穷大的任何东西都会进入最后一组。
`[
cbind(test, ifelse(test[, 2:3] <= 8, 1,ifelse(test[, 2:3] <= 11, 2, 3)))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    1    6   11   16   21    1    2
#[2,]    2    7   12   17   22    1    3
#[3,]    3    8   13   18   23    1    3
#[4,]    4    9   14   19   24    2    3
#[5,]    5   10   15   20   25    2    3
mat <- cbind(test, ifelse(test[, 2:3] <= 8, 1,ifelse(test[, 2:3] <= 11, 2, 3)))
cbind(mat, as.numeric(paste(mat[, 6], mat[, 7], sep="")))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    6   11   16   21    1    2   12
#[2,]    2    7   12   17   22    1    3   13
#[3,]    3    8   13   18   23    1    3   13
#[4,]    4    9   14   19   24    2    3   23
#[5,]    5   10   15   20   25    2    3   23