r - 有条件地将字符串转换为特定的数值
问题描述
我确信对此有一个简单的答案,但我已经扫描了堆栈溢出并且无法找到解决方案。似乎 sapply 和 ifelse 函数的组合可能会完成这项工作(但我不确定)。
所以我有一个带有字符的数据框,除了一列是数值。
####Create dataframe which needs converting
df <- data.frame(Sample_1 = rep(letters[1:3], each = 3),
Sample_2 = rep("a", times = 9))
df$Number <- rep(seq(from=1,to=3,by=1))
我想将此数据框中的字符转换为特定数字。字符需要转换成什么取决于最后一列中的数字。所以标准是:
- 如果 Number = 1,则 a 应更改为 30,b 应更改为 20,c 应更改为 10
- 如果 Number = 2,则 a 应更改为 35,b 应更改为 25,c 应更改为 15
- 如果 Number = 3,则 a 应更改为 40,b 应更改为 30,c 应更改为 20
这是一个突出显示此转换的数据框
A <- c(30,20,10)
B <- c(35,25,15)
C <- c(40,30,20)
Conversion_df <- data.frame(A, B,C)
这是所需的输出。
Final <- data.frame(Sample_1 = c(30,20,10,35,25,15,40,30,20),
Sample_2 = c(30,20,10,30,20,10,30,20,10))
预先感谢您的任何帮助。
解决方案
我也有一个dplyr
解决方案,但是使用case_when
,这可能更透明一些。这个想法来自这个答案https://stackoverflow.com/a/24459900/5795592
library(dplyr)
df %>% mutate( # Sample_1
Sample_1_conv = case_when( Number == 1 & Sample_1 == "a" ~ 30
, Number == 1 & Sample_1 == "b" ~ 25
, Number == 1 & Sample_1 == "c" ~ 10
, Number == 2 & Sample_1 == "a" ~ 35
, Number == 2 & Sample_1 == "b" ~ 25
, Number == 2 & Sample_1 == "c" ~ 15
, Number == 3 & Sample_1 == "a" ~ 40
, Number == 3 & Sample_1 == "b" ~ 30
, Number == 3 & Sample_1 == "c" ~ 20)
# Sample_2
, Sample_2_conv = case_when( Number == 1 & Sample_2 == "a" ~ 30
, Number == 1 & Sample_2 == "b" ~ 25
, Number == 1 & Sample_2 == "c" ~ 10
, Number == 2 & Sample_2 == "a" ~ 35
, Number == 2 & Sample_2 == "b" ~ 25
, Number == 2 & Sample_2 == "c" ~ 15
, Number == 3 & Sample_2 == "a" ~ 40
, Number == 3 & Sample_2 == "b" ~ 30
, Number == 3 & Sample_2 == "c" ~ 20)
)
推荐阅读
- font-awesome - 如何将 Font Awesome 与 Polymer LitElement 一起使用
- mysql - Hive 创建表失败
- c++ - while 循环中的 ofstream outputfile() 通常会生成空文件
- git - 查找(部分)文件何时在 git 中移动
- java - Java 代码没有 println 就无法工作
- android - 如何通过 gradle 从私人 gitlab 存储库下载 aar 文件
- javascript - 如何在附加的东西上调用函数
- c - 在命令行程序中将选项与非选项参数分开
- jquery - 如何使用 jQuery 插件样板调用带有选项的公共方法?
- python - 生成 JWT json Web 令牌并发布时出现 401 错误