楼主: K1ngFjsh
9065 19

[问答] 求助,R代码逐行单独运行 [推广有奖]

11
abelus 发表于 2022-3-3 14:58:11
> mat <- matrix(1:50, byrow = T, ncol = 5)
> mat
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20
[5,]   21   22   23   24   25
[6,]   26   27   28   29   30
[7,]   31   32   33   34   35
[8,]   36   37   38   39   40
[9,]   41   42   43   44   45
[10,]   46   47   48   49   50
> apply(mat, 1, function(x) max(c(10, x)))

12
K1ngFjsh 发表于 2022-3-3 16:56:11
abelus 发表于 2022-3-3 14:58
> mat  mat
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
这个好像是每一行整个去和10比呀,输出10,10,15,20,25,30,可否指定V1列呢?输出结果是10,10,11,16,21,26.。。。等等

13
abelus 发表于 2022-3-3 17:04:36
K1ngFjsh 发表于 2022-3-3 16:56
这个好像是每一行整个去和10比呀,输出10,10,15,20,25,30,可否指定V1列呢?输出结果是10,10,11,16,21,26 ...
pmax(10, mat[, 1])

14
abelus 发表于 2022-3-3 17:08:14
K1ngFjsh 发表于 2022-3-3 16:56
这个好像是每一行整个去和10比呀,输出10,10,15,20,25,30,可否指定V1列呢?输出结果是10,10,11,16,21,26 ...
如果是要每列都处理
apply(mat, 2, function(x) pmax(10, x))

也就等价于
mat[mat < 10] <- 10

通过您原始问题的描述不知道到底要得到个啥结果。

15
K1ngFjsh 发表于 2022-3-3 17:29:18
abelus 发表于 2022-3-3 17:08
如果是要每列都处理
apply(mat, 2, function(x) pmax(10, x))
可能我表述的不是很清楚,就是把第一列每一项设置个下限,让他们不得低于10,是不是我想的太复杂了有什么简单的处理方法?。原数据集:
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20
[5,]   21   22   23   24   25
[6,]   26   27   28   29   30
[7,]   31   32   33   34   35
[8,]   36   37   38   39   40
[9,]   41   42   43   44   45
[10,]   46   47   48   49   50
变成→:
     [,1] [,2] [,3] [,4] [,5]
[1,]   10    2    3    4    5
[2,]   10    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20
[5,]   21   22   23   24   25
[6,]   26   27   28   29   30
[7,]   31   32   33   34   35
[8,]   36   37   38   39   40
[9,]   41   42   43   44   45
[10,]   46   47   48   49   50

16
abelus 发表于 2022-3-4 07:52:09
K1ngFjsh 发表于 2022-3-3 17:29
可能我表述的不是很清楚,就是把第一列每一项设置个下限,让他们不得低于10,是不是我想的太复杂了有什么 ...
那就
mat[, 1] <- pmax(10, mat[, 1])
即可

17
K1ngFjsh 发表于 2022-3-4 15:45:04
abelus 发表于 2022-3-4 07:52
那就
mat[, 1]
谢谢大佬,还有这么个语句呢

18
K1ngFjsh 发表于 2022-3-4 19:41:34
abelus 发表于 2022-3-2 13:46
merge函数即可

或者tidyverse系列包中的*join就搞定
关于MERGE函数合并,因为我相当于双主键合并,首先在参数表中找到等级这一行,然后定位到第几年再返回,请问如何写才能让merge函数返回匹配上的特定列的值呢
主表:
等级 年份 参数
A1 1
A3 3
B1 5
C3 11
C1 9
参数表Para:
等级Y1 Y2 Y3 Y4
A 12 3 4
B 56 7 8
C 910 11 12
D13 14 15 16

其实我最初的想法是定位到参数表中的位置,如等级A第一年就赋值PARA[1,1],代码即
TABLE#参数 <- PARA[match(TABLE$等级,PARA#等级),match(paste0("Y",TABLE#年份),colnames(PARA)]
可是会报错,说什么如果我在[,]里列不能为一个list形式

19
abelus 发表于 2022-3-5 11:18:42
K1ngFjsh 发表于 2022-3-4 19:41
关于MERGE函数合并,因为我相当于双主键合并,首先在参数表中找到等级这一行,然后定位到第几年再返回,请 ...
para.long <- reshape(para, varying = list(2:5), idvar = 'lvl', timevar = 'year', v.names  = 'y', direction = 'long')
merge(dat, para.long, by = c('lvl', 'year'), all.x = T)

这样应该就可以得到结果了

20
K1ngFjsh 发表于 2022-3-9 11:53:19
abelus 发表于 2022-3-5 11:18
para.long
恩恩,这样就相当于把他们转置造了个双主键去匹配,谢谢大佬

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 14:16