我正在根据其他单元格中的值更改数据框中df $ AccPat列中的值。起点:
AccVs Verb Acc LVs AccPat
0 2 pádsáda fa 1 u
1 1 pácccaiiidncll ma 2 u
2 0 saa un 1 u
3 0 liss un 0 u
4 1 litátoko fa 0 u
5 1 wupágaak ma 1 u
我可以结合多种因素,因此:
df[df$Acc == "fa" & df$LVs == "0",]$AccPat <- "a"
AccVs Verb Acc LVs AccPat
0 2 pádsáda fa 1 u
1 1 pácccaiiidncll ma 2 u
2 0 saa un 1 u
3 0 liss un 0 u
4 1 litátoko fa 0 a
5 1 wupágaak ma 1 u
或者我可以使用grep在一列中选择与正则表达式匹配的行:
df[grep("^pá", df$Verb),]$AccPat <- "p"
AccVs Verb Acc LVs AccPat
0 2 pádsáda fa 1 p
1 1 pácccaiiidncll ma 2 p
2 0 saa un 1 u
3 0 liss un 0 u
4 1 litátoko fa 0 a
5 1 wupágaak ma 1 p
但是我想同时做两个,所以只选择与df $ AccVs中值为“1”的上述正则表达式匹配的行。
AccVs Verb Acc LVs AccPat
0 2 pádsáda fa 1 u
1 1 pácccaiiidncll ma 2 b
2 0 saa un 1 u
3 0 liss un 0 u
4 1 litátoko fa 0 a
5 1 wupágaak ma 1 u
我曾经认为这是不可能的,但this question让我觉得不是。但是,那里给出的解决方案对我不起作用。
df[grep("^pá", df$Verb) & df$AccVs == "1"]$AccPat <- "b"
导致错误“未选择的列选择”和“较长的对象长度不是较短的对象长度的倍数”,并且
df[grep("^pá", df$Verb) & df$AccVs == "1",]$AccPat <- "b"
尝试打印我的整个数据帧(比这个样本大得多),并且还会导致错误“较长的对象长度不是较短对象长度的倍数”。
注意:我要检查的许多值都是字符串,所以我需要一个适用于字符串的解决方案。我没有做任何数字化的事情,所以如果我将整数视为咒语就没问题。
答案 0 :(得分:0)
这是您的数据框:
df <- data.frame(AccVs=c(2,1,0,0,1,1), Verb=c("pádsáda","pácccaiiidncll","saa","liss","litátoko","wupágaak"),
Acc=c("fa","ma","un","un","fa","ma"),
LVs=c(1,2,1,0,0,1),
AccPat=rep("u",6),
stringsAsFactors=F)
grep
和==
会返回不同的类:
grep("^pá", df$Verb)
[1] 1 2
df$AccVs == "1"
[1] FALSE TRUE FALSE FALSE TRUE TRUE
使用grepl
返回logical
grepl("^pá", df$Verb)
[1] TRUE TRUE FALSE FALSE FALSE FALSE
结果:
AccVs Verb Acc LVs AccPat
1 2 pádsáda fa 1 u
2 1 pácccaiiidncll ma 2 b
3 0 saa un 1 u
4 0 liss un 0 u
5 1 litátoko fa 0 u
6 1 wupágaak ma 1 u