首页 > 解决方案 > 有条件地将字符串转换为特定的数值

问题描述

我确信对此有一个简单的答案,但我已经扫描了堆栈溢出并且无法找到解决方案。似乎 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))

我想将此数据框中的字符转换为特定数字。字符需要转换成什么取决于最后一列中的数字。所以标准是:

这是一个突出显示此转换的数据框

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))

预先感谢您的任何帮助。

标签: rdataframeif-statementsapply

解决方案


我也有一个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)
                        )

推荐阅读