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