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

时间:2017-07-20 18:35:12

标签: r mapping digital soil

我想我需要编写一个if / else循环来完成这个,但我不确定从哪里开始。我想在我的数据框的一列中搜索具有一定长度的值,并包含某个符号。例如,在列LAYER中,如果该值是两个符号长并​​且包含" 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

我对此的句子格式是" LAYER中的#if值是2个字符,其中一个是L,然后将VALUE,UPPER,LOWER,THICKNESS_MIN和THICKNESS_MAX列乘以1/2并更改此行的LAYER值为FF_FH

我还需要做同样的事情,但对于LAYER值为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

1 个答案:

答案 0 :(得分:1)

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

mydf <-
structure(list(LAYER = c("LF", "LFH", "FH", "FL", "LH"), VALUE = c(5L, 
9L, 4L, 11L, 50L), UPPER = c(0L, 0L, 0L, 0L, 0L), LOWER = c(4L, 
6L, 2L, 1L, 4L), THICKNESS_MIN = c(3L, 2L, 1L, 5L, 3L), THICKNESS_MAX = c(10L, 
9L, 8L, 6L, 4L), A1 = c(3.4, 3.7, 3.3, 3.8, 4.6), A2 = c(67L, 
65L, 35L, 56L, 43L), A3 = c(24L, 76L, 34L, 86L, 45L)), .Names = c("LAYER", 
"VALUE", "UPPER", "LOWER", "THICKNESS_MIN", "THICKNESS_MAX", 
"A1", "A2", "A3"), class = "data.frame", row.names = c(NA, -5L
))

现在,它非常简单,只需记住grepl返回的逻辑向量与第二个参数的大小相同,因此我们可以使用{{&}的输出对其进行AND运算(nchar) 1}}。

inx <- grepl("L", mydf$LAYER) & nchar(mydf$LAYER) == 2
mydf[inx, 2:5] <- mydf[inx, 2:5] * 1/2
mydf[inx, 1] <- "FF_FH"

如果interess列中的字符数为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