我有这样的数据帧-
A | B | C | D|
---|---|---|---|
名称-1 | 3.5 | NA | 3 |
名称-2 | Na | Na | <1>|
名称-3 | NA | 7 | NA |
名称-4 | NA | NA | NA |
名称-5 | 1 | NA | 1
使用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]], ""))