R:在每行中仅选择一个符合特定条件的元素

R:在每行中仅选择一个符合特定条件的元素,r,select,dataframe,R,Select,Dataframe,我有一个数据框,看起来像这样 x <- data.frame("a.1" = c(NA, NA, 101, 101, NA), "a.2" = c(NA, NA, 101, NA, NA), "a.3" = c(101, NA, NA, NA, 103), "a.4" = c(NA, NA , NA, NA, 103)) new column 1 101 2 NA 3 101 4

我有一个
数据框
,看起来像这样

x <- data.frame("a.1" = c(NA, NA, 101, 101, NA),
                "a.2" = c(NA, NA, 101, NA, NA),
                "a.3" = c(101, NA, NA, NA, 103),
                "a.4" = c(NA, NA , NA, NA, 103))
   new column
1  101
2  NA
3  101
4  101
5  103
你知道我怎样才能有效地做到这一点吗!我的原始数据帧非常大,因此我希望避免-循环和模糊的
ifelse
语句的计算开销很大

提前谢谢

编辑:

正如@akrun所指出的,使用
rowMeans()
是一个非常好的解决方案。然而,在我的原始数据集中,值101,102。。。实际上是表示某些行业的字符串。当然,我可以通过
将它们转换为.numeric
,但我有一些带有前导零的行业指标,如
013
0201
等。这些零在转换为数字时(逻辑上)会被消除,因此我无法转换它们


在这种情况下怎么办?

我们可以使用
pmax

 x$newcolumn <- do.call(pmax, c(x, list(na.rm=TRUE)))
 x$newcolumn
 #[1] 101  NA 101 101 103
更新 如果列是
字符
类,并且不想转换为
数字
,则一个选项是
max.col

x1[cbind(1:nrow(x1),max.col(!is.na(x1), 'first'))]
#[1] "012" NA    "012" "011" "011"
pmax
方法也应该有效

do.call(pmax, c(x1, na.rm=TRUE))
#[1] "012" NA    "012" "011" "011"
数据
x1我们可以使用
pmax

 x$newcolumn <- do.call(pmax, c(x, list(na.rm=TRUE)))
 x$newcolumn
 #[1] 101  NA 101 101 103
更新 如果列是
字符
类,并且不想转换为
数字
,则一个选项是
max.col

x1[cbind(1:nrow(x1),max.col(!is.na(x1), 'first'))]
#[1] "012" NA    "012" "011" "011"
pmax
方法也应该有效

do.call(pmax, c(x1, na.rm=TRUE))
#[1] "012" NA    "012" "011" "011"
数据
x1好的,我用
apply
lapply
和'ifelse``语句找到了一个解决方案……虽然没有我想要的那么干净,但它相当快而且有效

 x1 <- data.frame(a.1 = c(NA, NA, '012', '011', NA),
        a.2 = c(NA, NA, '012', NA, NA),
        a.3 = c('012', NA, NA, NA, '011'),
        a.4 = c(NA, NA , NA, NA, '011'), stringsAsFactors=FALSE)

new.column  <- x1 %>% 
   apply(1, function(i) unique(i[!is.na(i)])) %>% 
   lapply(function(i) ifelse(length(i) == 0, NA, i)) %>% 
   unlist()
x1%
lappy(函数(i)ifelse(长度(i)=0,NA,i))%>%
未列出()

好的,我用
apply
lapply
和“ifelse”语句找到了一个解决方案……虽然没有我想要的那么干净,但它相当快而且有效

 x1 <- data.frame(a.1 = c(NA, NA, '012', '011', NA),
        a.2 = c(NA, NA, '012', NA, NA),
        a.3 = c('012', NA, NA, NA, '011'),
        a.4 = c(NA, NA , NA, NA, '011'), stringsAsFactors=FALSE)

new.column  <- x1 %>% 
   apply(1, function(i) unique(i[!is.na(i)])) %>% 
   lapply(function(i) ifelse(length(i) == 0, NA, i)) %>% 
   unlist()
x1%
lappy(函数(i)ifelse(长度(i)=0,NA,i))%>%
未列出()

谢谢
rowMeans()
正是我想要的,因为它干净而且速度很快。这太完美了
do.call
我从来没有真正理解过,所以我很高兴避免它:-)@ManuelS谢谢你的评论
pmax
也应该很快。@akrun我重新编写了“已接受”的答案,因为我有一个新问题。Will Reacept虽然,因为它适用于原始问题。@ManuelS更新了帖子,请检查这是否有帮助,当其中一个解决方案适用于两种情况时,为什么要撤回接受的答案?谢谢
rowMeans()
正是我想要的,因为它干净而且速度很快。这太完美了
do.call
我从来没有真正理解过,所以我很高兴避免它:-)@ManuelS谢谢你的评论
pmax
也应该很快。@akrun我重新编写了“已接受”的答案,因为我有一个新问题。Will Reacept虽然,因为它适用于原始问题。@ManuelS更新了帖子,请检查这是否有帮助,当其中一个解决方案适用于两种情况时,为什么要撤回接受的答案?