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

如何比较和组合R中的字符串列,r,R,我是个新手,也许这是一件大家都知道该怎么做的蠢事,但我还没弄明白 我通过连接两个数据帧创建了一个数据帧,现在我有两个字符串列col.x和col.y,我需要将它们组合成一个 问题是这些值并不总是相等的,因此我想使用以下条件创建第三列: (1) 如果值相等,则使用第一列中的值 (2) 如果缺少一个值,请使用两列中任一列的可用值 (3) 如果它们不同,则插入“DIF” 我从这里得到了比较向量的基本概念——但是如果我试图使用第一个向量的值作为替换值,我就无法让代码工作 另一个问题的例子: ind <

我是个新手,也许这是一件大家都知道该怎么做的蠢事,但我还没弄明白

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

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

我从这里得到了比较向量的基本概念——但是如果我试图使用第一个向量的值作为替换值,我就无法让代码工作

另一个问题的例子:

ind <- df$Au == df$Au_ppb
df[ind, c("Au", "Au_ppb")] <- "EQUAL"
编辑以添加同事提供的解决方案:

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"))
df%突变(NewVariable=case_,当(!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,则可以使用此方法。由works提供的解决方案用于寻找相等和不同的直线

我从前面的问题中得到启发,给出了一个基本数据,我希望能够回答这个问题:

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

我鼓励您通过伊曼纽尔·帕拉迪斯(Emanuel Paradis)的这本非常好的参考书来学习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 <- 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
df
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
63005钠0.3

这将有助于提供一个完全可复制的示例。请使用
dput(head(df,n))
共享数据。另外,请更清楚地说明你到底想做什么。目前还不是很清楚,至少对我来说是这样。非常感谢!我对如此快速而有用的响应感到惊讶:)代码在查找不同的行和相等的行时效果很好,但我得到了一个错误:有趣的错误(newX[,I],…):参数的“类型”(字符)无效知道可能是什么问题吗?是的,我的数据是字符串,我需要比较的两个变量都是公司名称
col.x col.y company1 company1 NA company2 company3 NA company3 company3 company3 COMPANY4 LTD company 4
对不起,我不知道如何格式化注释中的列。我将示例数据添加到原始帖子中。如果没有
sum
代码运行,但是在结果列中,每个单元格都有一个向量(例如
c(nimi2.x=“eesti kontsert”,nimi2=“eesti kontsert”,ID.x)
)我从一位同事那里得到了帮助,实际上这解决了我80%的问题:
df%突变(NewVariable=case_当(!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”)
。。。其他用于查找不同和相等行的代码片段解决了剩余的20%。非常感谢。
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)]})
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