R:选择并更改数据框中列内的值

R:选择并更改数据框中列内的值,r,mapping,digital,soil,R,Mapping,Digital,Soil,我想我需要写一个if/else循环来完成这个任务,但是我不确定从哪里开始。我想在数据框的一列中搜索具有特定长度且包含特定符号的值。例如,在列层中,如果值有两个符号长,并且包含一个L,则可能是LF、FL、LH或HL,我想将其他列值乘以0.5 LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX A1 A2 A3 LF 5 0 4 3

我想我需要写一个if/else循环来完成这个任务,但是我不确定从哪里开始。我想在数据框的一列中搜索具有特定长度且包含特定符号的值。例如,在列层中,如果值有两个符号长,并且包含一个L,则可能是LF、FL、LH或HL,我想将其他列值乘以0.5

LAYER    VALUE    UPPER    LOWER    THICKNESS_MIN    THICKNESS_MAX    A1    A2    A3

LF        5        0        4           3                 10         3.4    67    24
LFH       9        0        6           2                 9          3.7    65    76
FH        4        0        2           1                 8          3.3    35    34
FL        11       0        1           5                 6          3.8    56    86
LH        50       0        4           3                 4          4.6    43    45
我的句子格式是,如果层中的值是2个字符,其中一个是L,那么将列值、上、下、厚度_最小值和厚度_最大值乘以1/2,并将该行的层值更改为FF_FH

我也需要这样做,但是对于层值为3个字符长的行,其他变量乘以2/3

我希望最终结果是这样的

LAYER    VALUE    UPPER    LOWER    THICKNESS_MIN    THICKNESS_MAX    A1    A2    A3

LF        2.5      0        2           1.5               5         3.4    67    24
LFH       3        0        2           1.3               3          3.7    65    76
FH        4        0        2           1                 8          3.3    35    34
FL        5.5      0        0.5         2.5               3          3.8    56    86
LH        25       0        2           1.5               2          4.6    43    45

首先,让我们将数据集放在一个可以复制并粘贴到R会话的表单中

如果感兴趣的列中的字符数是3,只需相应地调整代码即可

inx <- nchar(mydf$LAYER) == 3
mydf[inx, 2:5] <- mydf[inx, 2:5] * 2/3

mydf
  LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX  A1 A2 A3
1 FF_FH   2.5     0   2.0      1.500000            10 3.4 67 24
2   LFH   6.0     0   4.0      1.333333             9 3.7 65 76
3    FH   4.0     0   2.0      1.000000             8 3.3 35 34
4 FF_FH   5.5     0   0.5      2.500000             6 3.8 56 86
5 FF_FH  25.0     0   2.0      1.500000             4 4.6 43 45
inx <- grepl("L", mydf$LAYER) & nchar(mydf$LAYER) == 2
mydf[inx, 2:5] <- mydf[inx, 2:5] * 1/2
mydf[inx, 1] <- "FF_FH"
inx <- nchar(mydf$LAYER) == 3
mydf[inx, 2:5] <- mydf[inx, 2:5] * 2/3

mydf
  LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX  A1 A2 A3
1 FF_FH   2.5     0   2.0      1.500000            10 3.4 67 24
2   LFH   6.0     0   4.0      1.333333             9 3.7 65 76
3    FH   4.0     0   2.0      1.000000             8 3.3 35 34
4 FF_FH   5.5     0   0.5      2.500000             6 3.8 56 86
5 FF_FH  25.0     0   2.0      1.500000             4 4.6 43 45