如何在 R 中比较和组合字符串列

  • 本文关键字:组合 字符串 比较 r
  • 更新时间 :
  • 英文 :


我是R的新手,可能这是每个人都知道如何做的愚蠢的事情,但我无法弄清楚。

我通过连接 2 个数据帧创建了一个数据帧,现在我有两个字符串列 col.x 和 col.y,我需要将它们合并为一个。

问题是值并不总是相等的,所以我想使用以下条件创建第三列: (1( 如果值相等,则使用第一列中的值 (2( 如果缺少一个值,请使用两列中任一列中的可用值 (3( 如果它们不同,则插入"DIF">

我从这里得到了比较向量的基本想法 - 如果两列在 R 中匹配,则替换值 - 但是如果我尝试使用第一个向量的值作为替换值,我无法让代码工作。

另一个问题的例子:

ind <- df$Au == df$Au_ppb
df[ind, c("Au", "Au_ppb")] <- "EQUAL"

我想做什么:

ind <- df$Au == df$Au_ppb
df[ind, c("Au", "Au_ppb")] <- df$Au

你会怎么做?有没有明显的解决方案?

已编辑以添加数据示例:

col.x          col.y 
company1       company1 
NA             company2 
company3       NA 
company4       company_4 
company 5 LTD  company 5

已编辑以添加同事提供的解决方案:

df <- df %>% mutate (NewVariable=case_when(!is.na(col.x) ~ col.x, 
!is.na(col.y) ~ col.y, 
!is.na(col.x) & !is.na(col.y) & col.x!=col.y ~ "dif"))

如果您只需要连接两个字符串变量并忽略 NA-s,则此方法有效。Rémi Coulaud提供的解决方案用于找到相等和不同的线条。

我给出了一个受上一个问题启发的基本数据能够回答这个问题,我希望:

df <- data.frame(x= c(0.2, 0.2, 0.3, 0.4, 0.3, NA),
y = c(0.2, 0.4, 0.3, 0.6, NA, 0.4))
colnames(df) <- c("Au", "Au_ppb")
df :
Au Au_ppb
1 0.2    0.2
2 0.2    0.4
3 0.3    0.3
4 0.4    0.6
5 0.3     NA
6  NA    0.4

一个解决方案是这样的:

# line with at last one na value
ligne_na <- is.na(df$Au) | is.na(df$Au_ppb)
df$Newcolumn[ligne_na] <- apply(df[ligne_na,], 1, sum, na.rm = T)
# diff lines
df$Newcolumn[df$Au != df$Au_ppb & !ligne_na] <- "DIF"
# equal lines
i1 <- df$Au == df$Au_ppb & !ligne_na
df$Newcolumn[i1] <- df$Au[i1]
df :
Au Au_ppb Newcolumn
1 0.2    0.2       0.2
2 0.2    0.4       DIF
3 0.3    0.3       0.3
4 0.4    0.6       DIF
5 0.3     NA       0.3
6  NA    0.4       0.4

您可以在此处了解有关行选择和apply功能的更多信息。

编辑 1

问题来自sum.您无法sum字符类型。您可以用这个操作替换第一个操作(如果您只有两列。

ligne_na <- is.na(df$Au) | is.na(df$Au_ppb)
df$Newcolumn[ligne_na] <- apply(df[ligne_na,], 1, function(x){x[!is.na(x)]})

我鼓励你通过伊曼纽尔·帕拉迪斯的这个非常好的参考来学习R语言:这里。

这是一个使用base R的解决方案,其中ifelse()用于制作它:

z <- with(df,ifelse(Au==Au_ppb,"EQUAL",ifelse(Au!=Au_ppb,"DIF",NA)))
df <- within(df, Compare <- replace(z,is.na(z),rowSums(df[is.na(z),-1],na.rm = T)))

这样

> df
Sample  Au Au_ppb Compare
1   3000 0.2    0.2   EQUAL
2   3001 0.2    0.3     DIF
3   3002 0.2    0.2   EQUAL
4   3003 0.2    0.2   EQUAL
5   3004 0.3    1.0     DIF
6   3005  NA    0.3     0.3

数据

df <- structure(list(Sample = 3000:3005, Au = c(0.2, 0.2, 0.2, 0.2, 
0.3, NA), Au_ppb = c(0.2, 0.3, 0.2, 0.2, 1, 0.3), Compare = c("EQUAL", 
"DIF", "EQUAL", "EQUAL", "DIF", "0.3")), row.names = c(NA, -6L
), class = "data.frame")
> df
Sample  Au Au_ppb
1   3000 0.2    0.2
2   3001 0.2    0.3
3   3002 0.2    0.2
4   3003 0.2    0.2
5   3004 0.3    1.0
6   3005  NA    0.3

最新更新