R语言 将列折叠为新变量

kuarbcqp  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(182)

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

name = c("p1","p2","p3","p4")
place = c("f","g","h","i")
v1 = c("x", "NA", "NA", "NA")
v2 = c("NA", "y", "y", "NA")
v3 = c("NA", "NA", "z", "NA")
region = c("n","w","s","e")
grade = c("f1","f2","f3","f4")
df = data.frame(name, place, v1, v2, v3, region, grade)

  name place v1 v2 v3 region grade
1   p1     f  x NA NA      n    f1
2   p2     g NA  y NA      w    f2
3   p3     h NA  y  z      s    f3
4   p4     i NA NA NA      e    f4

我想添加一个新的字符向量v4,它包含来自任何列v1 v2 v3的字符。

name place v1 v2 v3 v4 region grade
1   p1     f  x NA NA  x      n    f1
2   p2     g NA  y NA  y      w    f2
3   p3     h NA  y  z yz      s    f3
4   p4     i NA NA NA NA      e    f4

非常感谢

mfuanj7w

mfuanj7w1#

我们可以在将列转换为character后使用paste

df$V4 <-  gsub("NA", "", do.call(paste, c(df[3:5], sep="")))
df$V4[df$V4==""] <- NA
df$V4
#[1] "x"  "y"  "yz"  NA

数据

df <- structure(list(name = c("p1", "p2", "p3", "p4"), place = c("f", 
"g", "h", "i"), v1 = c("x", NA, NA, NA), v2 = c(NA, "y", "y", 
NA), v3 = c(NA, NA, "z", NA), region = c("n", "w", "s", "e"), 
grade = c("f1", "f2", "f3", "f4")), .Names = c("name", "place", 
"v1", "v2", "v3", "region", "grade"), class = "data.frame",
 row.names = c("1", "2", "3", "4"))
0x6upsns

0x6upsns2#

dplyr替代方案:

install.packages("dplyr")
library(dplyr)
df <- df %>%
      mutate( v4 = gsub( "NA", "", paste0(v1,v2,v3) ) ) %>%
      mutate( v4 = ifelse( v4 == "", NA, v4 ) )

如果NA/“NA”是NA(非值)或“NA”(字符),这应该是有效的。如果你不关心v4是否包含“”或NA,你可以省略最后一行(并删除最后一个管道)。

相关问题