【问题标题】:R: Selecting and making changes to values within column in data frameR:选择并更改数据框中列内的值
【发布时间】:2017-07-20 18:35:12
【问题描述】:

我认为我需要编写某种 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

我对此的句子格式是“#if LAYER 中的值是 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

【问题讨论】:

    标签: r mapping digital soil


    【解决方案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 返回一个与其第二个参数大小相同的逻辑向量,因此我们可以将其 (&amp;) 与 nchar 的输出相加。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多