根据另一列的内容添加列

时间:2015-01-26 06:24:25

标签: r

我的问题
我的data.frame是174,792个障碍物。 2个变量。我希望在列中找到一个字符串,然后根据内容,插入一个包含相应字符串的新列。
如果我使用iris数据集......

示例
Species <- c("Setosa","Versicolor","Virginica")
Position <- c("Yard","Garden","Wild")

我想迭代Species列,对于每个物种,在右边创建一个包含该物种指定的Position的列。例如,我的数据集现在看起来像:

data.frame(iris)
Species, Position
Setosa, Yard {
{1}}
Versicolour, Garden
Setosa, Yard

我所尝试的内容
我已尝试Virginica, Wild并重复iris$Position <- ifelse(grepl("Setosa", iris$Species, ignore.case = T), "Yard"语句,将每个grepl及其Specie替换为Position,尽管R让我回复了以下错误...
{{1我出错的地方和/或是否有比上述更简洁的代码?
非常感谢。

2 个答案:

答案 0 :(得分:1)

这对于命名向量来说是完美的,但是为了使它能够处理内置的iris数据集,你需要匹配这个案例,所以我已经让你的物种变换了全部小写(因为这个方法没有ignore.case参数):

Species <- c("setosa","versicolor","virginica")
Position <- c("Yard","Garden","Wild")

named.pos = Position
names(named.pos) = Species
iris$position = named.pos[iris$Species]

至于你的错误,这是一个语法错误,这意味着你在某个地方错过了",但原则上你的想法也可以正常工作。它有点矫枉过正,因为grepl用于在字符串中搜索。由于您匹配整个字符串,因此您只需使用==,例如

iris$position = ifelse(iris$Species == "setosa", "Yard",  
                       ifelse(iris$Species == "versicolor", "Garden", "Wild"))

答案 1 :(得分:1)

levels(iris$Species)
#[1] "setosa"     "versicolor" "virginica" 

由于“物种”的levels与替换矢量(“位置”)的顺序相同,您可以使用factor并将labels指定为“位置”。

iris1 <- transform(iris, position=as.character(factor(Species, 
                            labels=Position)))