我目前有一个数据框,每列都有dimnames。在大多数情况下,这不是问题,但我最近添加了一个新列i
,由于某种原因,它被列为列表而不是向量。
这是一些行的示例:
i
正如您所看到的那样,qgf
目前被编码为> wc_results_data[12:20, 23]
$wc_1930_Uruguay
numeric(0)
$wc_1930_USA
numeric(0)
$wc_1934_Argentina
numeric(0)
$wc_1934_Austria
[1] 6
$wc_1934_Belgium
[1] 6
$wc_1934_Brazil
numeric(0)
$`wc_1934_Czech Republic/CSFR`
[1] 2
$wc_1934_Egypt
[1] 11
$wc_1934_France
[1] 6
,实际上它们应该是wc_results_data[c(12:14, 17, 23]
(我应该澄清实际的值在我的代码中也是0。)
关于这些价值的真的奇怪的是,如果我尝试对它们进行测试,我会得到奇怪的结果:
numeric(0)
为了尝试解决此问题,我尝试使用NAs
保存此列:
wc_results_data [,23]< - unlist(wc_results_data [,23])
但是我收到了这个错误:
> wc_results_data[12,23]
$wc_1930_Uruguay
numeric(0)
> identical(wc_results_data[12,23], numeric(0))
[1] FALSE
> length(wc_results_data[12,23])
[1] 1
这当然有道理,基本上我有57个观察unlist
,但我无法摆脱它们。有没有办法replacement has 368 rows, data has 425
并将这些numeric(0)
观察值存储为unlist
s?有人能告诉我我做错了吗?
根据下面的评论,这是我在data.frame的几行和几列上的numeric(0)
输出:
NA
答案 0 :(得分:3)
我将dput
输出分配给名称wc_results_data
,这是打印输出:
wc_results_data
fgd qgf qga
12 12
13 1
14 -1
15 0 6 1
16 -3 6 8
17 -2
18 3 2 1
19 -2 11 2
20 -1 6 1
相关列中的str
结果为:
str(wc_results_data$qgf)
List of 9
$ wc_1930_Uruguay : num(0)
$ wc_1930_USA : num(0)
$ wc_1934_Argentina : num(0)
$ wc_1934_Austria : num 6
$ wc_1934_Belgium : num 6
$ wc_1934_Brazil : num(0)
$ wc_1934_Czech Republic/CSFR: num 2
$ wc_1934_Egypt : num 11
$ wc_1934_France : num 6
- attr(*, "dim")= int 9
- attr(*, "dimnames")=List of 1
..$ : chr [1:9] "wc_1930_Uruguay" "wc_1930_USA" "wc_1934_Argentina" "wc_1934_Austria" ...
我需要在该列上使用sapply
来"应用" length
函数:
is.na( wc_results_data$qgf) <- sapply( wc_results_data$qgf, length) == 0
> wc_results_data
fgd qgf qga
12 12 NA
13 1 NA
14 -1 NA
15 0 6 1
16 -3 6 8
17 -2 NA
18 3 2 1
19 -2 11 2
20 -1 6 1
您可能需要首先使用此方法遍历所有列,以便您可以对其进行修改,使其行为类似于常规数据框。在这些列上使用unlist
无法生成数据帧结果。
答案 1 :(得分:3)
以下是tidyverse
library(tidyverse)
df %>%
mutate_at(2:3, funs(map(., ~ .x[1]) ))
# fgd qgf qga
#1 12 NA NA
#2 1 NA NA
#3 -1 NA NA
#4 0 6 1
#5 -3 6 8
#6 -2 NA NA
#7 3 2 1
#8 -2 11 2
#9 -1 6 1
以上内容将该列保留为list
,但如果需要将其作为常规列,请使用map_dbl
df %>%
mutate_at(2:3, funs(map_dbl(., ~ .x[1]) ))
答案 2 :(得分:2)
如果我理解正确,这是一个dplyr
解决方案:
library(tidyverse);
df %>%
mutate(
qgf = unlist(ifelse(sapply(qgf, length) == 0, NA, qgf)),
qga = unlist(ifelse(sapply(qga, length) == 0, NA, qga)))
# fgd qgf qga
#1 12 NA NA
#2 1 NA NA
#3 -1 NA NA
#4 0 6 1
#5 -3 6 8
#6 -2 NA NA
#7 3 2 1
#8 -2 11 2
#9 -1 6 1
实际上唯一的dplyr
依赖是mutate
所以基础R解决方案就是这么简单:
df$qgf <- unlist(ifelse(sapply(df$qgf, length) == 0, NA, df$qgf));
df$qga <- unlist(ifelse(sapply(df$qga, length) == 0, NA, df$qga));
df <- structure(list(fgd = structure(c(12, 1, -1, 0, -3, -2, 3, -2,
-1), .Dim = 9L, .Dimnames = list(c("wc_1930_Uruguay", "wc_1930_USA",
"wc_1934_Argentina", "wc_1934_Austria", "wc_1934_Belgium", "wc_1934_Brazil",
"wc_1934_Czech Republic/CSFR", "wc_1934_Egypt", "wc_1934_France"
))), qgf = structure(list(wc_1930_Uruguay = numeric(0), wc_1930_USA = numeric(0),
wc_1934_Argentina = numeric(0), wc_1934_Austria = 6, wc_1934_Belgium = 6,
wc_1934_Brazil = numeric(0), `wc_1934_Czech Republic/CSFR` = 2,
wc_1934_Egypt = 11, wc_1934_France = 6), .Dim = 9L, .Dimnames = list(
c("wc_1930_Uruguay", "wc_1930_USA", "wc_1934_Argentina",
"wc_1934_Austria", "wc_1934_Belgium", "wc_1934_Brazil", "wc_1934_Czech Republic/CSFR",
"wc_1934_Egypt", "wc_1934_France"))), qga = structure(list(
wc_1930_Uruguay = numeric(0), wc_1930_USA = numeric(0), wc_1934_Argentina = numeric(0),
wc_1934_Austria = 1, wc_1934_Belgium = 8, wc_1934_Brazil = numeric(0),
`wc_1934_Czech Republic/CSFR` = 1, wc_1934_Egypt = 2, wc_1934_France = 1), .Dim = 9L, .Dimnames = list(
c("wc_1930_Uruguay", "wc_1930_USA", "wc_1934_Argentina",
"wc_1934_Austria", "wc_1934_Belgium", "wc_1934_Brazil", "wc_1934_Czech Republic/CSFR",
"wc_1934_Egypt", "wc_1934_France")))), .Names = c("fgd",
"qgf", "qga"), row.names = 12:20, class = "data.frame")