取消R中的对象,但用NC替换数字(0)

时间:2018-04-10 00:27:30

标签: r list numeric

我目前有一个数据框,每列都有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

3 个答案:

答案 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")