使用R,如何使用基于与A列值的关系的前一行值填充B列中数据帧的空单元格

时间:2016-12-28 02:03:31

标签: r string rows

我有这种类型的数据框:

new_am = [12.33, 15.23] 

new_fr = [0.11, 1.01] 

基本上,我需要将字符串粘贴到' DESC'列中包含相应的ID'行。最终,结果应如下所示:

df <- data.frame(ID = rep(letters[1:5], each = 2), 
DESC = as.character(as.factor(rep(c("Petit", " ", "Small", " ", "Medium", " ", "Large", " ", "X-Large", " "), times = 1))))

请注意我的实际数据框架不是这么简单。例如,我在ID&#39;中有相同的名字。从1到25的行数不同的列,我需要将值粘贴到&#39; DESC&#39;对于那个相应的ID。&#39;所以,ID&#39; a&#39;在'DESC&#39;中可能有24行我需要在其中填写“Petit&#39;和&#39; b&#39;我有一行需要填写“小”。

我尝试编写脚本,包括sapply,grep,paste但是失败了。 我尝试编写一个循环,但是当我指向df $ DESC时它似乎存储为一个因素,虽然我将它强制为一个字符向量...任何帮助,指令或指向可以处理这个的函数都是很大的赞赏。我知道我可以简单地在excel中做到这一点,但这是重点! 我试图在R中学习如何做到这一点,无法在网上找到有关此主题的任何帮助。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果在第一个位置使用非空白值对ID进行排序,则可以执行简单的“填充”操作。与Reduce

df$DESC = Reduce(function(x,y) if (y==' ') x else y, df$DESC, acc=T)

> df
#    ID    DESC
# 1   a   Petit
# 2   a   Petit
# 3   b   Small
# 4   b   Small
# 5   c  Medium
# 6   c  Medium
# 7   d   Large
# 8   d   Large
# 9   e X-Large
# 10  e X-Large

答案 1 :(得分:0)

如果您可以使用包zoo

df[df$DESC==" ","DESC"] <- NA    # Correctly code missing values
df$DESC <- zoo::na.locf(df$DESC)

   ID    DESC
1   a   Petit
2   a   Petit
3   b   Small
4   b   Small
5   c  Medium
6   c  Medium
7   d   Large
8   d   Large
9   e X-Large
10  e X-Large

答案 2 :(得分:0)

以下是dplyr

的选项
library(dplyr)
df %>% 
  group_by(ID) %>%
  mutate(DESC = first(DESC))
#      ID    DESC
#   <fctr>  <fctr>
#1       a   Petit
#2       a   Petit
#3       b   Small
#4       b   Small
#5       c  Medium
#6       c  Medium
#7       d   Large
#8       d   Large
#9       e X-Large
#10      e X-Large

或使用data.table

library(data.table)
setDT(df)[, DESC := DESC[1L], by = ID]

答案 3 :(得分:0)

前向填充解决方案很好,但如果它没有排序,我们可以删除所有''行,并重复,然后合并回结果:

for df, ind_source in ["df1", "df2", "df3"], ["investingcom", "bloomberg", "ft"]:
        print(df+" "+ind_source)

更具可读性,分多步:

too many values to unpack (expected 2)