【问题标题】:Merge two rows in a dataframe in R合并R中数据框中的两行
【发布时间】:2014-04-07 04:19:02
【问题描述】:

我正在尝试根据<NA> 值合并我的data.frame 中的行。

这是我的数据框。

new <- data.frame (
  Location = c(rep("Loc 1", 4), rep("Loc 2", 4)), 
  Place = c("Powder Springs_Original", "Bridge_Other County", "Airport", "County1", "City 4 - Duplicated", "South", "County2", "Formal place"), 
  Val1 = c(109, 123, NA, 117, 143, NA, 151, 142), 
  Val2 = c(102, 115, NA, 45, 135, NA, 144, 125), 
  Val3 = c(99, 112, NA, 26,  127, NA, 140, 132), 
  Val4 = c(90, 103, NA, 57, 125, NA, 135, 201))

我期待类似的东西,

Location Place                      Val1 Val2 Val3 Val4
Loc 1    Powder Springs - Original  109   102   99  90
Loc 1    Bridge _ Other County      123   115  112  103
Loc 1    Airport County1            117   45    26  57
Loc 2    City 4 - Duplicated        143   135  127  125
Loc 2    South County2              151   144  140  135
Loc 2    Formal place               142   125  132  201

我想删除 NA 行并将数据与下一行合并。这些值的位置相同。有人可以在这里帮助我吗?

提前致谢。

【问题讨论】:

  • 您的 NA 值实际上是 NA 还是像 "NA" 这样的字符串?它们是有区别的。例如is.na("NA")FALSE
  • 它们实际上是类似 "NA" 的字符串。我在 R 中做到了这一点。is.na(new$Val1) [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  • 对不起@thelatemail。我的错。这些确实是 NA 值。我指的是错误的data.frameis.na 给了TRUE

标签: r dataframe


【解决方案1】:

首先,你不应该使用new 作为你的变量名,因为它是一个内置的 R 函数。其次,你可以这样做:

# Find which rows are NA
na_rows <- which(apply(new, 1, function(x) all("NA" == (x[paste0('Val', 1:4)]))))
# Set correct place names
new$Place <- as.character(new$Place)
new$Place[na_rows + 1] <- paste(new$Place[na_rows], new$Place[na_rows + 1])
# Remove NAs
new <- new[-na_rows, ]
#   Location                   Place Val1 Val2 Val3 Val4
# 1    Loc 1 Powder Springs_Original  109  102   99   90
# 2    Loc 1     Bridge_Other County  123  115  112  103
# 4    Loc 1         Airport County1  117   45   26   57
# 5    Loc 2     City 4 - Duplicated  143  135  127  125
# 7    Loc 2           South County2  151  144  140  135
# 8    Loc 2            Formal place  142  125  132  201

【讨论】:

  • 感谢您的帖子。这真的很有帮助。一个快速的问题是,我可以将其与单个列进行比较。当我尝试这样的cols &lt;- new[,c(3)] na_rows2 &lt;- which(apply(new, 1, function(x) all("NA" == cols))) 时,它给了我integer(0)。我想知道这一点,因为我的data.frame 中的列名之一是Price in dollars given。因为这不是Val1/2/3/4,所以我很想知道如何做到这一点。提前致谢
  • 我这边的更正。 NA's 实际上是 NA 值,而不是 "NA" 字符串。很抱歉造成混乱
  • 我认为您的“First off”声明在这里是不必要的。例如,请参阅this
【解决方案2】:

(因最初的答案不完整而编辑)

nu <- data.frame (
  Location = c(rep("Loc 1", 4), rep("Loc 2", 4)), 
  Place = c("Powder Springs_Original", "Bridge_Other County", "Airport", "County1", "City 4 - Duplicated", "South", "County2", "Formal place"), 
  Val1 = c(109, 123, NA, 117, 143, NA, 151, 142), 
  Val2 = c(102, 115, NA, 45, 135, NA, 144, 125), 
  Val3 = c(99, 112, NA, 26,  127, NA, 140, 132), 
  Val4 = c(90, 103, NA, 57, 125, NA, 135, 201), stringsAsFactors=FALSE)
# notice stringsAsFactors = FALSE
# if there was justice in the world, it should be FALSE by default in R
# in any case, nu$Place should be character rather than factor so in real data 
# you may need to do nu$Place <- as.character(nu$Place)

ic <- which(!complete.cases(nu))
nu$Place[ic-1] <- paste(nu$Place[ic-1], nu$Place[ic])
nu <- nu[-ic,]

这能满足你的需要吗?

【讨论】:

  • 嗨@lebatsnok。它给了我NA's 所在的地方。我想合并NA's 以外的值。我在上面编辑了我的问题。你能调查一下吗?谢谢
  • 感谢@lebatsnok 的回复。这很有帮助,幸运的是,我也能够解决它。唯一的是,我的要求是nu$Place[ic+1] &lt;- paste(nu$Place[ic], nu$Place[ic+1])。这也不是问题。感谢您的支持。
【解决方案3】:

感谢您的帮助和支持。经过大量的跟踪,我得到了以下所需的输出。 (根据@Robert Krzyzanowski 的建议,我将我的data.frame 重命名为Test)。

这就是我所做的。请提出建议,如果观察到任何奇怪的东西。

> new_DF <- subset(Test, is.na(Test$Val1))
> new_DF
  Location   Place Val1 Val2 Val3 Val4
3    Loc 1 Airport   NA   NA   NA   NA
6    Loc 2   South   NA   NA   NA   NA
> 
> row.names(new_DF)
[1] "3" "6"
> x.num <- as.numeric(row.names(new_DF))
> 
> Test$Place <- as.character(Test$Place)
> Test$Place[x.num + 1] <- paste(Test$Place[x.num], Test$Place[x.num + 1])
> Test <- Test[-x.num, ]
> Test
  Location                   Place Val1 Val2 Val3 Val4
1    Loc 1 Powder Springs_Original  109  102   99   90
2    Loc 1     Bridge_Other County  123  115  112  103
4    Loc 1         Airport County1  117   45   26   57
5    Loc 2     City 4 - Duplicated  143  135  127  125
7    Loc 2           South County2  151  144  140  135
8    Loc 2            Formal place  142  125  132  201

再次感谢大家的支持和花时间研究此事。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多