我想遍历数据框中的特定列并创建新列
我有一个看起来像这样的数据框:
a b c d
2.8 A A T
1.9 T G T
1.7 G G A
2.3 T T G
我想要这样的输出:
a b c c_1 d d_1
2.8 A A 2.8 T 0
1.9. T G 0 T 1.9
1.7 G G 1.7 A 0
2.3 T T 2.3 G 0
1.2 C G 0 C 1.2
基本上,如果c或d中的字母与b中的字母相同,则创建一个新列c_1
或d_1
,其值等于a,如果字母不同则等于0。
我只能对一列进行操作:
df$c_1 <-ifelse(df$c==df$b,df$a,0)
但是我有很多列(大约100列),如何为所有列做到这一点?
答案 0 :(得分:3)
使用dplyr
(dd是数据框的名称):
bind_cols(dd,transmute_at(dd, 3:4, ~ifelse(.==dd$b, dd$a,0)))
Transmute创建仅包含新列的数据框。在3:4
中,我选择要更改的列-在这种情况下,只需给出其索引向量即可。最后,bind_cols
是cbind的dplyr
变体,它将重命名新列以避免重复。
结果:
a b c d c1 d1
1 2.8 A A T 2.8 0.0
2 1.9 T G T 0.0 1.9
3 1.7 G G A 1.7 0.0
4 2.3 T T G 2.3 0.0
如果要按示例中的顺序对列进行排序,可以添加以下内容:
%>% .[,sort(names(.))]
哪个会给你:
a b c c1 d d1
1 2.8 A A 2.8 T 0.0
2 1.9 T G 0.0 T 1.9
3 1.7 G G 1.7 A 0.0
4 2.3 T T 2.3 G 0.0