如何根据某些条件更改列的值?

时间:2021-03-28 09:51:44

标签: r if-statement

我有一个名为 data1 的数据框。

> data1 <- data.frame(name = c("apple","apple","pine","pine", 
                                 "apple","apple", "pine","pine","banana","banana"),
                        characters = c("red","green","yellow","brown",
                                       "big","sweet","delicious","medium","soft", "long"))

    > data1  
     name characters
1   apple        red
2   apple      green
3    pine     yellow
4    pine      brown
5   apple        big
6   apple      sweet
7    pine  delicious
8    pine     medium
9  banana       soft
10 banana       long

我想根据字符列的值更改名称变量的相同值。 就像 data2 一样:

> data2
        name characters
1   colapple        red
2   colapple      green
3  colorpine     yellow
4  colorpine      brown
5   othapple        big
6   othapple      sweet
7    despine  delicious
8    despine     medium
9     banana       soft
10    banana       long

其实data1很大。我需要将 data1$name 中的相同值更改为特殊值。所以我需要一个通用的方法来实现它。我尝试使用 If 语句来执行此操作,但存在一些错误。我该怎么做?

1 个答案:

答案 0 :(得分:1)

就像我在对问题的评论中所说的那样,我没有看到列之间的关系,前缀不是按第一列的组更改吗?

如果是这样,下面的代码将满足问题的要求。它使用标准的 R k 技巧创建索引 cumsum。然后粘贴由索引 k 和列 data1$name 索引的前缀。

pref <- c("col", "color", "oth", "des")
k <- cumsum(c(1, abs(diff(data1$name == "apple")) > 0))

data2 <- data.frame(name = paste0(pref[k], data1$name),
                    characters = data1$characters)

data2
#        name characters
#1   colapple        red
#2   colapple      green
#3   colapple      white
#4  colorpine     yellow
#5  colorpine      brown
#6  colorpine      black
#7   othapple        big
#8   othapple      sweet
#9   othapple      small
#10   despine  delicious
#11   despine     medium
#12   despine       ache

编辑

在回答后发布新数据集并在评论中进行讨论后,这里有一个带有 setNamesmatch 的解决方案。

pref3 <- c(rep("col", 2), rep("color", 2), rep("oth", 2), rep("des", 2), rep("", 2))
pref3 <- setNames(pref3, data3$characters)

k <- match(data3$characters, names(pref3))
data3$name <- paste0(pref3[k], data3$name)

数据

data1 <- data.frame(name = c("apple","apple","apple", "pine","pine","pine",
                             "apple","apple","apple", "pine","pine","pine"),
                    characters = c("red","green","white","yellow","brown","black",
                                   "big","sweet","small","delicious","medium","ache"))

data3 <- data.frame(name = c("apple","apple","pine","pine", 
                             "apple","apple", "pine","pine","banana","banana"),
                    characters = c("red","green","yellow","brown",
                                   "big","sweet","delicious","medium","soft", "long"))