【问题标题】:Extract values for a column from another column based on another column in data frame R基于数据框R中的另一列从另一列中提取一列的值
【发布时间】:2017-06-21 16:59:33
【问题描述】:

我正在使用数据框,我需要按如下方式提取数据:

我有以下数据框。

a = c(1:40)
b = c(41:80)
c = c(81:120)
d = c('a','b','c','d','e')
e = NA
f = NA
g = NA
df = cbind.data.frame(a,b,c,d,e,f,g)
names(df) = c('1m','2m','3m','reg','1m_comp','2m_comp','3m_comp')


1m 2m 3m reg  1m_comp 2 m_comp  3m_comp
 1 41 81   a      NA      NA      NA
 2 42 82   b      NA      NA      NA
 3 43 83   c      NA      NA      NA
 4 44 84   d      NA      NA      NA
 5 45 85   e      NA      NA      NA
 6 46 86   a      NA      NA      NA

如果 'reg' 列具有特定值,我会使用 inside 函数用 '1m'、'2m' 列中的值填充 'comp' 列。

我这样做:

df = within(df, {
1m[reg=='a'] <- 1m_comp[reg=='a']
2m[reg=='a'] <- 2m_comp[reg=='a']
3m[reg=='a'] <- 3m_comp[reg=='a']})

我正在处理的数据框有 46+46 个这样的列(列和组合)。我没有写 46 行代码,而是尝试了

df = within(df, {
for (i in 1:46) {
str_c(i,'m_comp')[reg=='a'] = str_c(i,'m')[reg=='a']}})

但是,我的数据框没有任何变化。我也没有看到任何错误。

编辑:现在解决了!谢谢 d.b.

【问题讨论】:

  • df[df$reg == "a", 5:7] = df[df$reg == "a", 1:3]
  • 是否可以使用列名而不是列号来做到这一点?
  • df[df$reg == "a", c("1m_comp", "2m_comp", "3m_comp")] = df[df$reg == "a", c("1m", "2m", "3m")]
  • 非常感谢!

标签: r dataframe


【解决方案1】:

如果您不想对所有列名进行硬编码,可以使用类似的方法。

comp.cols <- colnames(df)[grepl("_comp", colnames(df)) == TRUE]
non.comp.cols <- sub("_comp", "", comp.cols)

df[df[,"reg"] == "a", comp.cols] <- df[df[,"reg"] == "a", non.comp.cols]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2022-01-14
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多