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更新了帖子,请检查这是否有帮助,当其中一个解决方案适用于两种情况时,为什么要撤回接受的答案?