r - 如何根据某些条件更改列的值?
问题描述
我有一个名为 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
我想根据字符列的值更改名称变量的相同值。就像数据2:
> 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 语句来执行此操作,但有一些错误。我该怎么做?
解决方案
就像我在对问题的评论中所说的那样,我没有看到列之间的关系,前缀不是按第一列的组而变化吗?
如果是这样,下面的代码将完成问题的要求。k
它使用标准 Rcumsum
技巧创建索引。k
然后粘贴由 index和 column索引的前缀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
编辑
在答案之后发布新数据集并在评论中进行讨论后,这里有一个setNames
和的解决方案match
。
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"))
推荐阅读
- django - 使用设置模块为本地和部署运行 Heroku
- javascript - 如何根据这些组件中定义的某些操作在页面上呈现不同的组件?
- linux - libfuzzer 分段错误(核心转储)
- angular - emoji-mart 对话框打开很慢
- python - 如何保存交互式 Matplotlib 图
- powershell - 如果 Get-EC2Tag 命令在变量下,则无法打印结果
- reactjs - 如何在 Next.js next.config.js 中组合几个 module.exports?
- javascript - 如何在 Leaflet 中正确设置活动区域?
- python - 将 bool_list 传递给 pybiomart 包中的方法
- regex - sendmail mailq 按年份正则表达式排序,更新命名约定