我的数据框有两列“a”和“b”,交替缺失值(NA
)
a b
dog <NA>
mouse <NA>
<NA> cat
bird <NA>
我想“合并”/将它们组合到一个看起来像这样的新列c,即每行中的非NA
元素被选中:
c
dog
mouse
cat
bird
我尝试了merge
和join
,但都没有按照我的意愿行事。也许是因为我没有合并的id?对于整数,我只是绕过这个并添加两列,但在我的情况下如何?
答案 0 :(得分:8)
您可以尝试pmax
df$c <- pmax(df$a, df$b)
df
# a b c
# 1 dog <NA> dog
# 2 mouse <NA> mouse
# 3 <NA> cat cat
# 4 bird <NA> bird
...或ifelse
:
df$c <- ifelse(is.na(df$a), df$b, df$a)
对于包含两列以上列表的更一般的解决方案,您可以找到几种在R here中实现合并的方法。
答案 1 :(得分:4)
我为这种类型的任务写了一个coalesce()函数,它的工作方式与SQL coalesce函数非常相似。你会像
一样使用它dd<-read.table(text="a b
dog NA
mouse NA
NA cat
bird NA", header=T)
dd$c <- with(dd, coalesce(a,b))
dd
# a b c
# 1 dog <NA> dog
# 2 mouse <NA> mouse
# 3 <NA> cat cat
# 4 bird <NA> bird
答案 2 :(得分:3)
这是我的尝试(由@MrFlick修改)
df$c <- apply(df, 1, function(x) na.omit(x)[1])
df
# a b c
# 1 dog <NA> dog
# 2 mouse <NA> mouse
# 3 <NA> cat cat
# 4 bird <NA> bird
答案 3 :(得分:3)
另一种选择是将which
与arr.ind=TRUE
indx <- which(!is.na(df), arr.ind=TRUE)
df$c <- df[indx][order(indx[,1])]
df
# a b c
#1 dog <NA> dog
#2 mouse <NA> mouse
#3 <NA> cat cat
#4 bird <NA> bird
或者
df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]
答案 4 :(得分:2)
1 ENG-101 English
2 CS-103 Computer Science
3 MAT-101 Algebra
4 GS-102 Geography Studies
正是您所需要的功能dpyr
coalesce()
答案 5 :(得分:2)
使用if else逻辑:
[AllowAnonymous]
[Route("autoupdate")]
public async Task<IActionResult> ProfileWebhook()
{
var formData = await this.Request.ReadFormAsync();
var config = TelemetryConfiguration.CreateDefault();
var client = new TelemetryClient(config);
client.TrackException(new Exception(string.Join("~", formData.Keys)));
logger.LogError(new Exception(string.Join("~", formData.Keys)), "Fail");
throw new Exception(string.Join("~", formData.Keys));
}
答案 6 :(得分:1)
您可以使用简单的apply
:
df$c <- apply(df,1,function(x) x[!is.na(x)] )
> df
a b c
1 dog <NA> dog
2 mouse <NA> mouse
3 <NA> cat cat
4 bird <NA> bird