我想我需要编写一个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
答案 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