>新手在这里... 想知道解决这个问题的最佳方法是什么
我有一个这样的数据帧,我从csv文件中读取
data <- data.frame(
V1=c("name1","name2","name3","name4"),
V2=c("id11","id21","id31","id41"),
V3=c("id12","","","id42"),
V4=c("id13","","","")
)
我想要以下结果
result <- c(
"id11"="name1",
"id12"="name1",
"id13"="name1",
"id21"="name2",
"id31"="name3",
"id41"="name4",
"id42"="name4")
我想知道最简单的解决方案是执行应用(但是什么功能(还是应该查看咕噜声(如果是这样,什么功能会对我有所帮助?
谢谢
这是一个tidyverse
/dplyr
的解决方案:
library(dplyr)
data %>%
pivot_longer(-V1) %>%
filter(value != "") %>%
pivot_wider(names_from = value, values_from = V1) %>%
fill(id11:id42, .direction = "updown") %>%
select(-name) %>%
distinct()
这为我们提供了:
# A tibble: 1 x 7
id11 id12 id13 id21 id31 id41 id42
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 name1 name1 name1 name2 name3 name4 name4
您可以使用逐行apply
。从行中删除所有空值。根据非空值的length
重复第一个值并指定名称。
unlist(apply(data, 1, function(x) {
name <- x[-1][x[-1] != '']
setNames(rep(x[1], length(name)), name)
}))
# id11 id12 id13 id21 id31 id41 id42
#"name1" "name1" "name1" "name2" "name3" "name4" "name4"