有些日子以来,我试图找到一种方法来通过比较列中的字符和另一列中的字符串来对数据框进行子集化。
如果字符不在字符串中,我想将值复制到新列。我搜索了高低,尝试了很多例子,但由于某种原因,我没有让它在我的数据框架上工作。
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。
我发现的所有示例仅应用(和工作)比较单个字符,例如&#34; K&#34;使用向量c进行硬编码(&#34; K&#34;,&#34; L&#34;,&#34; M&#34;)左右,但绝不是一个如何将其应用于数据框列和行的示例
我有点紧张......
任何人都知道我做错了什么?
更新
Thanx到下面的答案,我的代码现在看起来像这样,并做我需要的:
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)]
答案 0 :(得分:2)
您的代码无法正常工作的原因是
strsplit(as.character(df$CODE,""))
返回一个列表。相反,您需要使用mapply
来检测是否匹配。
这里我们使用了grep
,它允许更灵活的字符匹配
# The values of FIX & CODE are passed to i and j
mapply(function(i, j) length(grep(i, j)), df$FIX, df$CODE)
或使用%in%
## Suggested by akrun
mapply('%in%', df$FIX,strsplit(as.character(df$CODE), ''))