我一直在寻找很多解决方案,但是找不到。我将不胜感激任何帮助。我有一个如下数据框:
A B C D
x na na z
x t na na
na z na x
y na s na
我想要的输出是:
A1 B1
x z
x t
z x
y s
答案 0 :(得分:2)
假设您的“ na”实际上是NA
s,并且您要删除的每一行中有相等数量的NA
s,您可以这样做
data.frame(t(apply(df, 1, function(x) x[!is.na(x)])))
# X1 X2
#1 x z
#2 x t
#3 z x
#4 y s
如果您使用字符串“ na”,则
data.frame(t(apply(df, 1, function(x) x[x != "na"])))
应该工作。
答案 1 :(得分:1)
如何创建一个运算符以使其尽可能可读?
library(dplyr)
`%|%` <- function(x,y) ifelse(is.na(x), y, x)
df %>%
transmute(A1 = A %|% B %|% C %|% D,
B1 = D %|% C %|% B %|% A)