首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以不同的方式替换值

以不同的方式替换值
EN

Stack Overflow用户
提问于 2021-05-11 17:13:46
回答 3查看 54关注 0票数 2

我有如下数据:

代码语言:javascript
复制
| genome |time_1|time_2|time_3|time_4|
|genome_1|  28  |28    |NA    |NA    |
|genome_2|  2   |4     |5     |2     |
|genome_3|  12  |12    |12    |12    |
|genome_4|  2   |NA    |NA    |NA    |
|genome_5|  3   |3     |NA    |NA    |

我希望在每一行中用1替换相同的值(即至少出现两次),用0替换一次的值。我想要的桌子应该是这样的:

代码语言:javascript
复制
| genome |time_1|time_2|time_3|time_4|
|genome_1|  1   |1     |NA    |NA    |
|genome_2|  1   |0     |0     |1     |
|genome_3|  1   |1     |1     |1     |
|genome_4|  0   |NA    |NA    |NA    |
|genome_5|  1   |1     |NA    |NA    |

有什么办法吗?非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-11 17:46:43

在R基地,您将做:

代码语言:javascript
复制
id <-t(apply(df[-1], 1, function(x)duplicated(x, NA)|duplicated(x, NA, TRUE)))
cbind(df[1], NA^is.na(df[-1]) * id)


    genome time_1 time_2 time_3 time_4
1 genome_1      1      1     NA     NA
2 genome_2      1      0      0      1
3 genome_3      1      1      1      1
4 genome_4      0     NA     NA     NA
5 genome_5      1      1     NA     NA

你也可以:

代码语言:javascript
复制
 df %>%
  pivot_longer(starts_with("time"))%>%
  mutate(value = (duplicated(value, NA)|duplicated(value, NA, TRUE))* NA^is.na(value))%>%
  pivot_wider()

# A tibble: 5 x 5
  genome   time_1 time_2 time_3 time_4
  <chr>     <int>  <int>  <int>  <int>
1 genome_1      1      1     NA     NA
2 genome_2      1      0      0      1
3 genome_3      1      1      1      1
4 genome_4      1     NA     NA     NA
5 genome_5      1      1     NA     NA
票数 4
EN

Stack Overflow用户

发布于 2021-05-11 17:41:09

从你似乎不关心联系的评论来看,下面是一种使用rowwise的潜在方法

代码语言:javascript
复制
library(dplyr)
data %>%
   rowwise() %>%
   mutate(across(time_1:time_4,
                 ~ case_when(is.na(.) ~ NA_real_,
                             . == tail(as.numeric(names(sort(table(c_across(time_1:time_4))))),1) ~ 1,
                             TRUE ~ 0)
           ))
## A tibble: 5 x 5
## Rowwise: 
#  genome   time_1 time_2 time_3 time_4
#  <chr>     <dbl>  <dbl>  <dbl>  <dbl>
#1 genome_1      1      1     NA     NA
#2 genome_2      1      0      0      1
#3 genome_3      1      1      1      1
#4 genome_4      1     NA     NA     NA
#5 genome_5      1      1     NA     NA

数据:

代码语言:javascript
复制
data <- structure(list(genome = c("genome_1", "genome_2", "genome_3", 
"genome_4", "genome_5"), time_1 = c(28L, 2L, 12L, 2L, 3L), time_2 = c(28L, 
4L, 12L, NA, 3L), time_3 = c(NA, 5L, 12L, NA, NA), time_4 = c(NA, 
2L, 12L, NA, NA)), class = "data.frame", row.names = c(NA, -5L
))
票数 2
EN

Stack Overflow用户

发布于 2021-05-11 17:38:22

这似乎适用于我:

代码语言:javascript
复制
a= cbind(c(28,2,12,2,3),c(28,4,12,NA,3))
a= cbind(a,c(NA,5,12,NA,NA))
a=cbind(a, c(NA,2,12,NA,NA))
a = as.data.frame(a)

e = function(i){
  i = as.numeric(i)
  b= table(i)
  b= ifelse(b>1,1,0)
  b = as.data.frame(b)
 b = b[as.character(i),]
 return(b)
}
t(apply(a, 1, e))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67491450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档