自从几天以来,我试图通过比较一列中的字符和另一列中字符串来找到一种方法来子集我的数据帧。
如果字符不在字符串中,我想将值复制到新列。我到处搜索,尝试了很多例子,但出于某种原因,我没有让它在我的数据框架上工作。
df <- structure(list(POLY = c("K3", "K3", "K3", "K4", "K4", "K4", "K4",
"K6", "K6", "K7", "K7", "K7", "L1", "L1", "L1"), FIX = c("O",
"K", "M", "M", "K", "O", "L", "K", "M", "K", "O", "M", "M", "L",
"O"), SESSTIME = c(310, 190, 181, 188, 151, 260, 268, 200, 259,
245, 180, 188, 259, 199, 244), CODE = c("KO", "KO", "KO", "KM",
"KM", "KM", "KM", "KM", "KM", "KO", "KO", "KO", "LMO", "LMO",
"LMO")), .Names = c("POLY", "FIX", "SESSTIME", "CODE"), row.names = c(42L,
44L, 46L, 115L, 116L, 117L, 133L, 225L, 231L, 269L, 270L, 328L,
420L, 425L, 431L), class = "data.frame")
这是它的一部分:
row.names POLY FIX SESSTIME CODE SESSTIME2
1 42 K3 O 310 KO NA
2 44 K3 K 190 KO NA
3 46 K3 M 181 KO ...
4 115 K4 M 188 KM
5 116 K4 K 151 KM
6 117 K4 O 260 KM NA
7 133 K4 L 268 KM 268
8 225 K6 K 200 KM NA
9 231 K6 M 259 KM
10 269 K7 K 245 KO
11 270 K7 O 180 KO
12 328 K7 M 188 KO 188
13 420 L1 M 259 LMO
14 425 L1 L 199 LMO
15 431 L1 O 244 LMO
因此,当FIX不在CODE中时,SESSTIME的值应复制到SESSTIME2(列已预填充NA)
例如,我用
df$FIX %in% strsplit(as.character(df$CODE,""))
但比较总是TRUE。
我发现的所有示例都只适用于(并工作过)单个字符的比较,例如“K”与矢量c(“K”、“L”、“M”)等硬编码,但从来没有将其应用于数据帧列和行的示例。
我有点紧张。。。
有人知道我做错了什么吗?
更新:
感谢下面的答案,我的代码现在看起来像这样,并且可以满足我的需要:
df3$SESSTIME2[!(mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)) & is.na(df$SESSTIME2)]
<-
df$SESSTIME[!(mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)) & is.na(df$SESSTIME2)]