仅为非空白值复制其余列中的第1列值

  • 本文关键字:余列中 1列值 复制 空白 r
  • 更新时间 :
  • 英文 :


我有这样的数据帧-

D<1>1
A B C
名称-1 3.5 NA 3
名称-2 Na Na
名称-3 NA 7 NA
名称-4 NA NA NA
名称-5 1 NA

使用dplyr:中的across()尝试此操作

library(dplyr)
#Code
new <- df %>% mutate(across(B:D,~ifelse(!is.na(.),A,'')))

输出:

A      B      C      D
1 Name-1 Name-1        Name-1
2 Name-2               Name-2
3 Name-3        Name-3       
4 Name-4                     
5 Name-5 Name-5        Name-5

使用的一些数据:

#Data
df <- structure(list(A = c("Name-1", "Name-2", "Name-3", "Name-4", 
"Name-5"), B = c(3.5, NA, NA, NA, 1), C = c(NA, NA, 7L, NA, NA
), D = c(3L, 1L, NA, NA, 1L)), class = "data.frame", row.names = c(NA, 
-5L))

另一个选项是case_when

library(dplyr)
df %>%
mutate(across(B:D, ~ case_when(!is.na(.) ~ A)))

数据

df <- structure(list(A = c("Name-1", "Name-2", "Name-3", "Name-4", 
"Name-5"), B = c(3.5, NA, NA, NA, 1), C = c(NA, NA, 7L, NA, NA
), D = c(3L, 1L, NA, NA, 1L)), class = "data.frame", row.names = c(NA, 
-5L))

尝试下面的代码

> cbind(df[1], ifelse(!is.na(df[-1]), df$A[row(df)], ""))
A      B      C      D
1 Name-1 Name-1        Name-1
2 Name-2               Name-2
3 Name-3        Name-3
4 Name-4
5 Name-5 Name-5        Name-5

数据

> dput(df)
structure(list(A = c("Name-1", "Name-2", "Name-3", "Name-4", 
"Name-5"), B = c(3.5, NA, NA, NA, 1), C = c(NA, NA, 7, NA, NA
), D = c(3, 1, NA, NA, 1)), class = "data.frame", row.names = c(NA,
-5L))

类似于Duck,但对于任何数量的列,假设第一列始终命名为A:

library(dplyr)
df %>% mutate(across(-A,  ~if_else(!is.na(.), A, "")))

循环方法:

for(col in 2:ncol(your_data)) {
your_data[[col]] = ifelse(!is.na(your_data[[col]]), your_data[[1]], "")
}

或者使用lapply代替

your_data[-1] = lapply(your_data[-1], function(x) ifelse(!is.na(x), your_data[[1]], ""))

最新更新