我有一个分类变量,表明流感诊所的位置以及“其他”类别。选择“其他”类别的参与者会为其所在地提供开放式回复。在大多数情况下,这些开放式回答符合现有类别之一(例如,一个类别是“公共卫生诊所”,但一些受访者选择“其他”并引用“商城”,这是一个公共卫生诊所)。我可以轻松地手工完成这项工作,但想学习选择“商城”字符串的代码,然后使用逻辑表达式将这些人分配到“公共卫生诊所”(例如,为流感诊所的位置创建一个新变量)。
我的分类变量是“lrecflu2”,我的字符串变量是“lfother”
到目前为止,我有:
mall <- grep("MALL", Motiv82012$lfother, value = TRUE)
这给了我一个包含所有字符串响应的向量,其中包含“MALL”(所有字符串都在数据框中为大写字母)
如何在逻辑表达式中使用此向量来创建新变量,将这些人分配到“公共卫生诊所”类别,并为未选择“其他”的人分配流感诊所位置变量的原始值(并且新的流感诊所位置变量中没有字符串变量中的值?
也许,grep甚至不是正确使用的功能。
答案 0 :(得分:0)
据我了解,您在数据框中有一列,您希望将一个字符值重新分配给另一个字符。如果是这样,你几乎就在那里......
set.seed(1) # for generating an example
df1 <- data.frame(flu2=sample(c("MALL","other","PHC"),size=10,replace=TRUE))
df1$flu2[grep("MALL",df1$flu2)] <- "PHC"
这里grep()
为您提供所需的矢量索引;然后根据此对子集进行子集化并更改这些元素。
更新2
这应该会产生与您正在使用的data.frame
类似的set.seed(1)
lreflu2 <- sample(c("PHC","Med","Work","other"),size=10,replace=TRUE)
Ifother <- rep("",10) # blank character vector
s1 <- c("Frontenac Mall","Kingston Mall","notMALL")
Ifother[lreflu2=="other"] <- s1
df1 <- data.frame(lreflu2,Ifother)
### alternative:
### df1 <- data.frame(lreflu2,Ifother, stringsAsFactors = FALSE)
df1
:
lreflu2 Ifother
1 Med
2 Med
3 Work
4 other Frontenac Mall
5 PHC
6 other Kingston Mall
7 other notMALL
8 Work
9 Work
10 PHC
给出:
grep
如果您正在寻找完全匹配的字符串,则根本不需要df1$lreflu2[df1$Ifother=="MALL"] <- "PHC"
:
regex
使用df1$lreflu2[grep("Mall",df1$Ifother)] <- "PHC"
:
lreflu2 Ifother
1 Med
2 Med
3 Work
4 PHC Frontenac Mall
5 PHC
6 PHC Kingston Mall
7 other notMALL
8 Work
9 Work
10 PHC
给出:
Ifother
data.frame
是具有模式特征的因子还是向量不会影响事物。 {{1}}默认情况下会将字符串向量强制转换为因子。