【问题标题】:fill missing elements in each row in a R data.frame填充 R data.frame 中每一行中的缺失元素
【发布时间】:2020-05-08 21:23:52
【问题描述】:

我有一个导入为 data.frame 的 csv 文件,问题是每行必须有 4 个元素(4 列),其中一些可能有不同数量的元素,我的意思是:

ID  col1 col2 col3 col4
id1  dA  dB    dC   dD
id2  aA  aB    aC   aD
id3  mA  mB    mC
id4  xA  xB    xC   XD

我正在使用 tidyr,当我导入数据时,它会用 NA 填充每个缺失的元素,在本例中是 col4 处的 id3。

id3  mA  mB    mC NA

我想修复每行中少于 4 个元素的所有行(如 id3),只是在缺少的元素中添加一个未分类 (UNC) 的内容,例如:

ID  col1 col2 col3 col4
id1  dA  dB    dC   dD
id2  aA  aB    aC   aD
id3  mA  mB    mC  UNC
id4  xA  xB    xC   XD

这是我的代码:

df <- read.csv("file.csv", comment.char = "#", header = TRUE, sep = "\t")

#add the id as row name:
rownames(df) <- paste("id", 1:nrow(df), sep = "")

# eliminate some elements of the data frame 
df[, 2:ncol(df)] <- NULL

# add a name of each column and split elements based in ";" character 
#at this point the "df" has a single column named "old_name":

df <- df %>% tidyr::separate(old_name, c("col1", "col2", "col3", "col4"), sep = ";", extra="drop")

任何建议!!!

非常感谢

【问题讨论】:

  • 根据您的代码,您有一个要拆分的列。在显示的数据中,有 4 列。哪个是正确的
  • 请提供有效代码;您的 ""col4 是语法/解析错误。 (我知道我可以很容易地编辑它,但是......我不想掩盖你可能遇到但不知道的问题,也不想在我推断不正确时引入其他错误/差异。)
  • dat[] &lt;- lapply(dat, function(a) if (is.character(a)) replace(a, is.na(a), "UNC") else a)?
  • 很抱歉语法错误,它是 "col4" 而不是 ""col4 ... 非常感谢!
  • 这不能直接工作吗? df[is.na(df)] &lt;- 'UNC'

标签: r dataframe tidyr


【解决方案1】:

我们可以使用

library(dplyr)
df1 %>%
    mutate_if(is.character, ~ replace(., is.na(.), "UNC"))

或在base R

i1 <- sapply(df1, is.character)
df1[i1][is.na(df1[i1])] <- "UNC"

【讨论】:

  • 非常感谢,它适用于 R 基础。还有一个问题,如果我对这一行使用 R base 或 dplyr: df % tidyr::separate(old_name, c("col1", "col2", "col3", "col4"), sep = ";", extra="drop") 怎么可能??我问是因为用这种方法它会给我一个警告,所以我想用另一种方法......非常感谢!!!
  • @abraham 不清楚警告是否友好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2021-02-24
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多