如何根据R中的条件将值从一列移动到另一列?

zbwhf8kr  于 2023-03-15  发布在  其他
关注(0)|答案(3)|浏览(207)

我有一个三列的数据框:Col1、Col2、Col3。Col1中的数据可以是数字或文本。如果Col1中的值大于1000000,我希望将该值移至下一列(Col2)。以下是数据示例:

df <- data.frame(Col1 = c(1100000, 5320133, "Teste", "Cor13", "Fell505", 2732154),
                 Col2 = c(0, 0, 1100000, 5320133, 2732154, 0),
                 Col3 = c(0, 0, 0, 0, 0, 0))

我希望将数据转换为如下形式:

df_new <- data.frame(Col1 = c("", "", "Teste", "Cor13", "Fell505", ""),
                     Col2 = c(1100000, 5320133, 1100000, 5320133, 2732154, 2732154),
                     Col3 = c(0, 0, 0, 0, 0, 0))

在R中如何实现这一点?

bqujaahr

bqujaahr1#

library(tidyverse)
df %>% mutate(test=as.numeric(Col1),
              test2=as.numeric(Col2),
              Col2=ifelse(test>1000000,Col1,Col2),
              Col2=ifelse(is.na(Col2)==T,test2,Col2)) %>% 
  dplyr::select(Col1,Col2,Col3 )%>% 
  mutate(test=as.numeric(Col1),
         Col1=ifelse(is.na(test)==T,Col1,"")) %>% 
  dplyr::select(!test)

使用多种数据类型会使这一点变得困难,而且这也不是很清楚,但我将把这一部分留给您。

neekobn8

neekobn82#

使用str_extract获取数字。注意,这将替换 Col2 中的值。如果要确保保留数据,请使用val + Col2

library(stringr)
library(dplyr)

df %>% 
  mutate(val = as.numeric(str_extract(Col1, "\\d+")), 
  Col2 = if_else(val > 1000000 & !is.na(val), val, Col2), 
  val = NULL)
     Col1    Col2 Col3
1 1100000 1100000    0
2 5320133 5320133    0
3   Teste 1100000    0
4   Cor13 5320133    0
5 Fell505 2732154    0
6 2732154 2732154    0

如果要使用base R

val <- as.numeric(gsub("\\D+", "", df$Col1))

df$Col2 <- ifelse(val > 1000000 & !is.na(val), val, df$Col2)

df
     Col1    Col2 Col3
1 1100000 1100000    0
2 5320133 5320133    0
3   Teste 1100000    0
4   Cor13 5320133    0
5 Fell505 2732154    0
6 2732154 2732154    0
ru9i0ody

ru9i0ody3#

使用循环的基R方法(不太像R)可能是:

for(i in 1:nrow(df)) {

  # for checks coerce entries to numeric 
  if(as.numeric(df$Col1[i]) > 1e6 & !is.na(as.numeric(df$Col1[i]))) {

    # duplicate entry from Col1 to Col2
    df$Col2[i] <- df$Col1[i]

    # replace respective entry in Col1
    df$Col1[i] <- " " # or NA, NaN 

    } 

}

给予

> df
     Col1    Col2 Col3
1         1100000    0
2         5320133    0
3   Teste 1100000    0
4   Cor13 5320133    0
5 Fell505 2732154    0
6         2732154    0

我们可以忽略警告消息,因为它们或多或少是is.na()-trick用来克服不常见数据格式的。或者,您可以将循环 Package 到suppressWarnings()中。

相关问题