我是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