【发布时间】:2015-04-04 04:39:37
【问题描述】:
从某些天开始,我尝试通过将列中的字符与另一列中的字符串进行比较来找到一种方法来对我的数据框进行子集化。
如果字符不在字符串中,我想将值复制到新列。我搜索了高低,尝试了许多示例,但由于某种原因,我无法让它在我的数据框上工作。
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)]
【问题讨论】:
标签: r dataframe string-comparison