我有这种类型的数据框:
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中学习如何做到这一点,无法在网上找到有关此主题的任何帮助。
谢谢!
答案 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)