如何删除 R 中的 na 并使低于值上升
How do I remove na in R and make below value to go up
我有如下数据框:
如何删除 na 并使用以下值来增加?
谢谢
id name.america name.europe name.asia
1 a <NA> <NA>
2 <NA> b <NA>
3 <NA> <NA> c
4 d <NA> <NA>
更改为:
id name.america name.europe name.asia
1 a b c
2 d
我们可以遍历列并删除 NA
,然后通过在获取 NA
后追加 NA
使 list
元素的 lengths
相同max
list
元素的长度。基于此,子集数据集的 'id' 列并附加输出
lst <- lapply(df1[-1], na.omit)
lst1 <- lapply(lst, `length<-`, max(lengths(lst)))
out <- data.frame(lst1)
out1 <- cbind(id = df1$id[seq_len(nrow(out))], out)
out1
# id name.america name.europe name.asia
#1 1 a b c
#2 2 d <NA> <NA>
如果我们需要将 NA
更改为空白 (""
) - 不推荐
out1[is.na(out1)] <- ""
数据
df1 <- structure(list(id = 1:4, name.america = c("a", NA, NA, "d"),
name.europe = c(NA, "b", NA, NA), name.asia = c(NA, NA, "c",
NA)), class = "data.frame", row.names = c(NA, -4L))
df1[, -1] <- lapply(df1[,-1], function(x) c(na.omit(x), rep("",length(x)-length(na.omit(x)))))
df1[1:max(colSums(!(df1[,-1]==""))),]
# id name.america name.europe name.asia
#1 1 a b c
#2 2 d
tidyverse
基于解决方案
require(tidyverse)
df1 %>%
gather(key = "name", value = "val", -id) %>%
na.omit() %>%
select(-id) %>%
group_by(name) %>%
mutate(id = 1:n()) %>%
spread(key = name, value = val)
结果
# A tibble: 2 x 4
id name.america name.asia name.europe
<int> <chr> <chr> <chr>
1 1 a c b
2 2 d NA NA
备注
- 如果需要,您可以在转换之前使用
select
或该变量重新排序列。
NAs
保留原样。如果需要,您可以使用 tidyr::replace_na
插入一些字符串或 space。我不鼓励你那样做。
数据
取自上文@akrun's 。
df1 <- structure(
list(
id = 1:4,
name.america = c("a", NA, NA, "d"),
name.europe = c(NA, "b", NA, NA),
name.asia = c(NA, NA, "c",
NA)
),
class = "data.frame",
row.names = c(NA, -4L)
)
我有如下数据框:
如何删除 na 并使用以下值来增加?
谢谢
id name.america name.europe name.asia
1 a <NA> <NA>
2 <NA> b <NA>
3 <NA> <NA> c
4 d <NA> <NA>
更改为:
id name.america name.europe name.asia
1 a b c
2 d
我们可以遍历列并删除 NA
,然后通过在获取 NA
后追加 NA
使 list
元素的 lengths
相同max
list
元素的长度。基于此,子集数据集的 'id' 列并附加输出
lst <- lapply(df1[-1], na.omit)
lst1 <- lapply(lst, `length<-`, max(lengths(lst)))
out <- data.frame(lst1)
out1 <- cbind(id = df1$id[seq_len(nrow(out))], out)
out1
# id name.america name.europe name.asia
#1 1 a b c
#2 2 d <NA> <NA>
如果我们需要将 NA
更改为空白 (""
) - 不推荐
out1[is.na(out1)] <- ""
数据
df1 <- structure(list(id = 1:4, name.america = c("a", NA, NA, "d"),
name.europe = c(NA, "b", NA, NA), name.asia = c(NA, NA, "c",
NA)), class = "data.frame", row.names = c(NA, -4L))
df1[, -1] <- lapply(df1[,-1], function(x) c(na.omit(x), rep("",length(x)-length(na.omit(x)))))
df1[1:max(colSums(!(df1[,-1]==""))),]
# id name.america name.europe name.asia
#1 1 a b c
#2 2 d
tidyverse
基于解决方案
require(tidyverse)
df1 %>%
gather(key = "name", value = "val", -id) %>%
na.omit() %>%
select(-id) %>%
group_by(name) %>%
mutate(id = 1:n()) %>%
spread(key = name, value = val)
结果
# A tibble: 2 x 4
id name.america name.asia name.europe
<int> <chr> <chr> <chr>
1 1 a c b
2 2 d NA NA
备注
- 如果需要,您可以在转换之前使用
select
或该变量重新排序列。 NAs
保留原样。如果需要,您可以使用tidyr::replace_na
插入一些字符串或 space。我不鼓励你那样做。
数据
取自上文@akrun's
df1 <- structure(
list(
id = 1:4,
name.america = c("a", NA, NA, "d"),
name.europe = c(NA, "b", NA, NA),
name.asia = c(NA, NA, "c",
NA)
),
class = "data.frame",
row.names = c(NA, -4L)
)